我正在开发一个带有grails的个人项目,以便学习这个强大的工具。 在我的域类“Post”中添加两个新字段(x,y)时遇到此问题:
class Post {
long id;
Date creationDate;
String text;
byte[] image;
Style style;
long likeCount;
long dislikeCount;
User owner;
//coordinates on the wall
int x;
int y;
//this is probably to remove
static hasMany = [judgment : Judgment];
static constraints = {
text(nullable:true, maxSize:5000);
image(nullable:true, maxSize:1000000);
creationDate(nullable:true);
x(nullable:true);
y(nullable:true);
}
}
我在postgres数据库上创建了一些数据(Post记录)之后添加了x和y。 但是当我在grails控制台中运行app时会出现这个错误:
| Error 2012-03-04 12:04:23,670 [pool-5-thread-1] ERROR hbm2ddl.SchemaUpdate - Unsuccessful: alter table post add column x int4 not null
| Error 2012-03-04 12:04:23,672 [pool-5-thread-1] ERROR hbm2ddl.SchemaUpdate - ERROR: column "x" contains null values
这很奇怪,因为我在约束x中声明,y是可以为空的。所以为什么grails尝试改变我的表,声明x和y不为空?
答案 0 :(得分:4)
它们是原始int
字段,因此可以为空是没有意义的。您不能在类实例中存储空值,如果数据库中有空值,则没有合理的默认转换为int
值。您可以将0视为null的合理值,但0和null通常不等效。
如果要允许原始数字(int
,long
等)或boolean
的空值使用非原始对象类Integer
,{ {1}},Long
等原始类型的另一个问题是验证。由于它们默认为0(或Boolean
false
),您无法知道用户是选择0还是boolean
,或者他们是否根本没有做出选择而您只是构造函数的默认值。因此,将它们设置为非原始状态会使它们false
,并且您可以知道它们是否做出了选择。
此外,无关 - 您无需声明null
字段,因为Grails无论如何都会为您添加一个字段。并丢失分号;)