【问题标题】:Id is set to NULL when trying to save DomainObject in Grails尝试在 Grails 中保存 DomainObject 时,ID 设置为 NULL
【发布时间】:2013-01-08 15:21:50
【问题描述】:

我有两个与下面的 Foo 类结构相同的域对象

class Foo {

    static mapping = {
        id column: "old_id_column"
        prop1 column: "old_prop_1"
        ... some more properties ...
    }
}

class Bar {
    ... looks the same as Foo ...
}

在类的控制器中,我尝试完成同样的事情,创建一个新对象并将其保存到数据库中。

当我这样做时

class FooController {

    def methodName() {
        final Foo foo = new Foo()
        foo.prop1 = "val1"
        foo.prop2 = val2
        etc.

        foo.save(flush: true)
    }
} 

一切正常,但是当我尝试在 BarController 中执行相同操作时,我得到以下异常

无法将值 NULL 插入列“old_id_column”、表“System.db.Bar”;列不允许空值。

我正在尝试对遗留数据库进行建模,所以很明显我在底层数据库的配置中遗漏了一些东西,但我找不到任何东西。关于可能引发此异常的事情的任何想法?

【问题讨论】:

    标签: grails grails-orm grails-2.0


    【解决方案1】:

    你需要指定一个生成器

    id generator:'assigned', column: 'old_id_column', type: 'string'
    

    查看文档@http://grails.org/doc/latest/ref/Database%20Mapping/id.html

    【讨论】:

    • 我以为总是指定某种默认生成器?我刚刚意识到我昨天错过了一些可能很重要的事情。在 Foo 类中,id 列的类型为 Integer (sqlType int),但在 Bar 类中,id 列的类型为 Short (sqlType smallint)。但是阅读 hibernate 文档 (docs.jboss.org/hibernate/core/3.6/reference/en-US/html/…) 这应该不是问题,因为“返回的标识符是 long、short 或 int 类型的”。而且指定生成器没有任何好处,我仍然会遇到同样的错误
    • 很可能,因为您指定了错误的生成器,在文档中可以是«increment, identity, sequence, hilo, seqhilo, uuid, guid, native,assigned, select, foreign 或 sequence-identity .»在你的情况下,它应该是增量。
    • 不,我尝试了 generatortypesqltype 的不同组合,但没有任何效果,而且不是生成器默认总是自动增量?所以我真的不需要指定一个生成器。
    • 也许您可以添加约束,id(nullable: true),将生成器分配给分配,这样,让遗留数据库管理 id 生成?
    • Uhm 没有将生成器设置为已分配意味着我想在将对象发送到休眠之前自己指定 ID?我最终通过更改数据库的身份规范来解决它。出于某种原因,唯一可行的方法是让数据库自动递增并使用默认生成器。无法让 hilo 或任何东西工作......
    猜你喜欢
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2014-12-19
    相关资源
    最近更新 更多