2011-12-25 78 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所有列。