3

我有一个抽象Event类,它包含所有事件类型共享的属性,在它下面我有两个子类,每个类有一个表(MasterEventParentEvent)。

问题是MasterEventid 列的类型是“number”,而ParentEvent它的类型是“varchar2”。这意味着当我尝试运行应用程序时,我得到:

由 HibernateException 引起:列 event_id 的 * 列类型错误。找到:数字,预期:varchar2(255 char)。

请注意,这是一个遗留数据库,因此不可能在数据库级别更改列类型。

下面的示例代码应该有助于更好地理解:

事件.groovy


package a

abstract class Event {
    String id

    static mapping = {
        tablePerHierarchy "false"
        id column: "id"
    }
}

父事件.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 忽略此验证?

4

3 回答 3

1

type: 'number'不起作用,因为它不是休眠基本类型

尝试将其更改为type: 'long'(或任何适合您的旧数据库)

另请参阅文档:链接


发表评论后编辑

我不知道您在抽象类中在做什么,但也许您可以做类似的事情并在抽象类中使用 getter(未经测试!):

class MasterEvent extends Event {

    Long longId        
    static mapping = {
        longId column: "id"
    }

    @Override
    String getId() {
        longId?.toString()
    }   
}
于 2013-02-26T14:15:14.393 回答
0

您是否尝试在子类中定义 id 字段?父事件中的“字符串 id”和主事件中的“长 id”?

于 2013-02-26T14:13:42.160 回答
0

您可以尝试使用数字 id 列并将其转换为字符串的自定义Hibernate UserType 。然后这将进入 MasterEvent 类:

static mapping = {
    id column: "id", type: NumberToStringType
}
于 2013-02-26T18:49:13.513 回答