Grails在更改表时生成错误

时间:2014-06-10 11:12:52

标签: grails sql-server-2012 gorm grails-domain-class grails-2.3

我正在尝试将已经存在的PHP应用程序移动到grails中。

我已经基于现有数据库创建了域,并且代码运行良好。

当我需要在我的域中添加一个额外的布尔字段时,会出现问题。

我收到以下错误。

2014-06-10 16:24:54,146 [localhost-startStop-1] ERROR hbm2ddl.SchemaUpdate  - Unsuccessful: alter table entry add expedite tinyint not null

Error |
2014-06-10 16:24:54,163 [localhost-startStop-1] ERROR hbm2ddl.SchemaUpdate  - ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'expedite' cannot be added to non-empty table 'entry' because it does not satisfy these conditions.

我试图在变量本身中指定默认值。

boolean expedite = false

我还尝试在静态映射中添加默认值,如下所示:

static mapping = {
    table 'entry'
    expedite defaultValue: false
    version false
}

但仍然会出现错误。知道我哪里错了吗?我正在使用sql server 2012。

3 个答案:

答案 0 :(得分:1)

因为默认情况下mysql将布尔字段映射为一位值,所以布尔字段的值不能为空。

通过以下方式手动更新现有记录:

update my_table set expedite = 0;

或者您可以使用grails数据库迁移插件为您生成迁移。

域类中的任何原始数据类型都会获得默认值,因此如果您已经定义了像Boolean expedite这样的新字段,那么它可以使用空值。

所以总是要确保原始和&非原始数据类型。

答案 1 :(得分:0)

看起来sql server使用0和1而不是TRUE / FALSE。这是你在找什么?

https://forum.hibernate.org/viewtopic.php?f=1&t=996345

另一个人这样解决了......

http://codexplo.wordpress.com/2012/06/21/mapping-a-boolean-with-hibernate/

看起来您只需要在域中创建一个方法来拦截和转换。

答案 2 :(得分:0)

尝试使用class,而不是基本类型:Boolean expedite