想用Grails這個東西生成指定為DECIMAL類型(NUMERIC類型)的字段,并控制精度, 搞了一下午未果, 于是請教山風小子, 最終兩個人試驗N次, 失敗N-1次的前提下, 最后一次終于成功了, 在這里尤其感謝山風的技術支持以及精神支持;
成功案例記錄在這里:
groovy(domain-class):
class Oldtable {
static withTable = "oldtable"
??? Integer id
???
BigDecimal? number //要為BigDecimal類型
??? static constraints = {
????????????
// 山風小子注:正確的約束應該為number(max:new BigDecimal("9999.999999"), scale:6)??? ??? ???
?number(max:1000, scale:6)??? //這個限制搞了很久才搞出來, 映射為DECIMAL(10,6)
??? ??? ??? }
}
DataSource:class DevelopmentDataSource {
?? boolean pooling = true
???
String dbCreate = "update" // one of 'create', 'create-drop','update'
??? String url = "jdbc:mysql://localhost:3306/grails"
??? String driverClassName = "com.mysql.jdbc.Driver"
??? String username = "ymiao"
??? String password = "letmein"
}
PS:
1. 最大的感觸是: 一定要練好英語
2.
mysql里面NUMERIC類型會自動轉換為DECIMAL類型, 比如用GUI工具建表指定為NUMERIC(10,6),
會自動轉換為DECIMAL(10,6),表示最高有效數字10位, 小數點后保留6位; 這里的precision="10" scale="6",
注意數據庫里的precision是有效數字, scale表示精確到小數點后的位數
// 山風小子注:number(max:new BigDecimal("9999.999999"), scale:6),4(小數點左側位數) + 6(scale) = 10(precision) => DECIMAL(10, 6)3.
number(max:1000, scale:6) 這個精度限制這么寫的原因一直搞不懂, 跟山風試驗了好多次才成功的, 最后理解為1000是4位, 4+6=10, precision="10", 同理
max:10000, scale:6會生成DECIMAL(11,6)類型的字段, 暫且這么理解吧...
4.
String dbCreate = "update", 這里用update, 如果數據庫中有對應的表, 則用舊表, 不會覆蓋舊表以及里面的數據
5. mysql數據庫中DECIMAL(10,6)類型的數據, 通過hibernate逆向映射生成的屬性是:
??????? <property name="number" type="java.lang.Double">
??????????? <column name="number" precision="10" scale="6" not-null="true" />
??????? </property>
但是在groovy里面定義為Double類型出現N多異常, 最終定義為
BigDecimal類型的成功;
6. 貼出常見類型的映射關系
Hibernate映射類型 Java類型 標準SQL類型
integer/int java.lang.Integer/int INTEGER 4字節
long java.lang.Long/long
BIGINT 8字節
short java.lang.Short/short SMALLINT 2字節
byte
java.lang.Byte/byte TINYINT 1字節
float java.lang.Float/float FLOAT 4字節
double java.lang.Double/double DOUBLE 8字節
big_decimal
java.math.BigDecimal NUMERIC
character
java.lang.Character/java.lang.String/char CHAR(1) 定長字符
string
java.lang.String VARCHAR 變長字符
boolean/ yes_no/true_false
java.lang.Boolean/Boolean BIT 布爾類型
date java.util.Date/java.sql.Date DATE 日期
timestamp java.util.Date/java.util.Timestamp TIMESTAMP 日期
calendar
java.util.Calendar TIMESTAMP 日期
calendar_date java.util.Calendar DATE 日期
binary byte[] BLOB
BLOB
text java.lang.String TEXT CLOB
serializable 實現java.io.Serializablej接口的任意Java類 BLOB BLOB
clob
java.sql.Clob CLOB CLOB
blob java.sql.Blob BLOB BLOB
class
java.lang.Class VARCHAR 定長字符
locale java.util.Locale VARCHAR 定長字符
timezone java.util.TimeZone VARCHAR 定長字符
currency java.util.Currency
VARCHAR 定長字符
7. 用于測試的mysql的schema+table
DROP TABLE IF EXISTS `grails`.`oldtable`;
CREATE TABLE? `grails`.`oldtable` (
? `id` int(11) NOT NULL,
? `number` decimal(10,6) NOT NULL,
? PRIMARY KEY? (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
8. Hibernate相關
http://docs.huihoo.com/framework/hibernate/reference-v3_zh-cn/toolsetguide.html
http://www.itpub.net/699923.html
// 山風小子注:成功其實就在你眼前,關鍵要看自己的恒心和毅力原文地址:http://miaoyachun.blog.sohu.com/43152463.html
附:
Groovy與Grails同甘共苦,苦盡甘來
posted on 2007-04-23 00:36
山風小子 閱讀(3417)
評論(6) 編輯 收藏 所屬分類:
Groovy & Grails