如何使用Grails将新的自动生成的主键字段添加到旧表中?

时间:2012-02-02 11:36:52

标签: grails mapping primary-key gorm legacy

我有一张遗留表我正试图与Grails联系。我将简化它的模型以使事情变得更容易。表中有两个字段:“NAME”,其类型为字符串,“CPAR”为Integer类型,其作用类似于表的ID(主键)。

我想要做的是保持“CPAR”以实现向后兼容,并在表格中插入一个新字段“ID”,该字段将自动生成,实际上是表的主键。

这是我的域类:

Class Partners {

    Long id
    String name
    Integer cpar

    static mapping = {
        table "PARTNERS"
        version false

        columns {
            id column: "ID", generator: "sequence"
            name column: "NAME"
            cpar column: "CPAR"
        }
    }
}

当我运行此应用程序时,它确实在表中创建了ID字段,但所有行都填充了零(“ID”字段为零,而不是整行)。当试图通过它的脚手架web界面访问应用程序时,它给了我错误:无法在null对象上获取属性'id'。我想要的是让那些“ID”字段填充适当的值而不是零。我怎么能做到这一点?我正在使用的数据库是Firebird。

1 个答案:

答案 0 :(得分:0)

我不熟悉Firebird,但我认为它使用类似于Oracle和MySql的序列。我看到的第一个问题是Long id的声明。 Hibernate为您提供了id,因此您不需要这行代码。接下来,您可以指定在定义列时要使用的序列。

static mapping = {
    columns {
        id column: "ID", generator:'sequence', params:[name:'PARTNERS_ID_SEQ']
    }
}

我从未使用columns{}闭包我总是在mapping{}闭包内完成所有列映射,因此我不能100%确定上面的代码是否有效。如果不是,您可以将生成器和名称移到columns{}之外,它应该可以工作:

static mapping = {
    columns {
        id column: "ID"
    }
    id generator:'sequence', params:[name:'PARTNERS_ID_SEQ']
}

本文特别谈到映射遗留表: http://dave-klein.blogspot.com/2008/03/grails-orm-dsl-rules.html

这是关于映射ID的Grails doc,它没有真正谈论序列名称: http://grails.org/doc/latest/ref/Database%20Mapping/id.html