我有一张遗留表我正试图与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。
答案 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