Grails将sqltype“number”强制转换为String

时间:2013-02-26 13:51:33

标签: grails gorm

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

问题是在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忽略此验证?

3 个答案:

答案 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
}