首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Grails使用not null而不是null更改我的表

问Grails使用not null而不是null更改我的表
EN

Stack Overflow用户
提问于 2012-03-04 19:08:43
回答 1查看 1.6K关注 0票数 1

为了学习这个强大的工具,我正在用grails开发一个个人项目。在向我的域类“Post”添加两个新字段(x,y)时,我遇到了这个问题:

代码语言:javascript
复制
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时,出现了这个错误:

代码语言:javascript
复制
| 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不为空呢?

EN

回答 1

Stack Overflow用户

发布于 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无论如何都会为您添加一个字段。并去掉分号;)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9554392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档