为了学习这个强大的工具,我正在用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不为空呢?
发布于 2012-03-04 23:08:13
它们是原始的int字段,所以可以为空没有意义。不能在类实例中存储NULL值,如果数据库中有NULL值,则不存在到int值的合理缺省转换。您可能会认为0是null的合理值,但是0和null通常不是等价的。
如果您想要允许原始数字(int、long等)为空值。或者对于boolean使用非原语对象类Integer、Long、Boolean等。原语类型的另一个问题是验证。由于它们的默认值为0(或者对于boolean为false ),您无法知道用户是选择了0还是false,或者他们根本没有做出选择,而您只有来自构造函数的默认值。因此,将它们设置为非原始值会使它们保持null状态,您可以知道它们是否做出了选择。
此外,无关-您不需要声明id字段,因为Grails无论如何都会为您添加一个字段。并去掉分号;)
https://stackoverflow.com/questions/9554392
复制相似问题