2011-12-25 71 views
3

我正在使用grails 2.0和mysql,我希望一些域屬性可以爲空。 在我的領域類我所做的:如何使用Grails 2.0獲得可空的約束?

static constraints = { 
    counter(nullable: true) 
    competitors(nullable: true) 
} 

開始我的Grails應用程序後,它會創建correspondending SQL但在我mysql表,屬性不是空的,他們是「NOT NULL」。

CREATE TABLE `lookup_query` (
`id` bigint(20) NOT NULL AUTO_INCREMENT, 
`version` bigint(20) NOT NULL, 
`competitors` bigint(20) NOT NULL, 
`counter` bigint(20) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

爲什麼我的mysql屬性「NOT NULL」而不是「NULL」?我希望他們是「空」。我的錯誤在哪裏?

+1

在MySQL中刪除'lookup_query'並再次運行Grails 2.0以確保在應用程序啓動過程中重新創建表。如果表字段仍然不是NULL,請分享您的整個LookupQuery域類代碼。 – 2011-12-25 22:02:10

+0

這不起作用。我越來越接近這個問題。 Hibernate不會使數據庫中的Long屬性爲空。使用字符串一切工作正常,但與長期屬性休眠不會讓他們在數據庫中可空...這是一個休眠錯誤? – whitenexx 2011-12-29 00:59:30

+2

確保你已經宣佈「長競爭者」不是「長競爭者」。 – 2011-12-29 07:50:44

回答

1

區別在於盒裝與非盒裝類型。盒裝類型是一個類,因此可以是空引用,而未裝箱類型是「基元」,不能包含空值。 GORM認識到這一點,並且知道對於基元類型你不能有一個空值,所以它不允許DB中的列爲空(即使你的constraints塊可能允許它),因爲它知道它不是可能在代碼中。

如果您希望某個字段可以爲空,那麼您的代碼必須允許它是這樣才能以這種方式創建數據庫。

另一種選擇是將GORM默認值從nullable: false更改爲nullable: true所有列。