Grails使用not null而不是null来改变我的表

时间:2012-03-04 11:08:43

标签: grails

我正在开发一个带有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不为空?

1 个答案:

答案 0 :(得分:4)

它们是原始int字段,因此可以为空是没有意义的。您不能在类实例中存储空值,如果数据库中有空值,则没有合理的默认转换为int值。您可以将0视为null的合理值,但0和null通常不等效。

如果要允许原始数字(intlong等)或boolean的空值使用非原始对象类Integer,{ {1}},Long等原始类型的另一个问题是验证。由于它们默认为0(或Boolean false),您无法知道用户是选择0还是boolean,或者他们是否根本没有做出选择而您只是构造函数的默认值。因此,将它们设置为非原始状态会使它们false,并且您可以知道它们是否做出了选择。

此外,无关 - 您无需声明null字段,因为Grails无论如何都会为您添加一个字段。并丢失分号;)