我有一个抽象的Event
类,它包含所有Event类型共享的属性,在它下面我有两个子类,每个类有一个表(MasterEvent
和ParentEvent
)。
问题是在MasterEvent
中,id列的类型为“number”,而在ParentEvent
中,它的类型为“varchar2”。
这意味着当我尝试运行应用程序时,我得到:
由HibernateException引起:列event_id中的列类型错误。找到:number,expected:varchar2(255 char)。
请注意,这是一个遗留数据库,因此无法更改数据库级别的列类型。
以下示例代码有助于更好地理解:
Event.groovy
package a
abstract class Event {
String id
static mapping = {
tablePerHierarchy "false"
id column: "id"
}
}
ParentEvent.groovy
package a
class ParentEvent extends Event {
static mapping = {
id column: "id"
}
}
MasterEvent.groovy
package a
class MasterEvent extends Event {
static mapping = {
id column: "id", type: "number"
}
}
我尝试过type: number
各种组合,但它总是给我同样的错误。
是否要将sqlType
直接投放到String
或者让grails忽略此验证?
答案 0 :(得分:1)
type: 'number'
不起作用,因为它不是hibernate basic type
尝试将其更改为type: 'long'
(或适合旧版数据库的任何内容)
另见文档:Link
在评论后进行修改
我不知道你在抽象类中做了什么,但也许你可以做类似的事情并在抽象类中使用getter(未测试!):
class MasterEvent extends Event {
Long longId
static mapping = {
longId column: "id"
}
@Override
String getId() {
longId?.toString()
}
}
答案 1 :(得分:0)
您是否尝试在子类中定义id字段?父事件中的“String id”和Master事件中的“long id”?
答案 2 :(得分:0)
您可以尝试使用自定义Hibernate UserType来获取数字ID列并将其转换为字符串。然后这将进入MasterEvent类:
static mapping = {
id column: "id", type: NumberToStringType
}