Hibernate 在Grails中使用Groovy枚举作为Id字段

Hibernate 在Grails中使用Groovy枚举作为Id字段,hibernate,grails,gorm,Hibernate,Grails,Gorm,我们在GORM中有一些遗留数据库映射,还有一些映射有一个主键,即枚举。枚举是使用字符串值而不是序数存储的 例如: class AccountingGLMap { AccountingTypeCode id String typeCode static mapping = { id(column: 'accountingTypeCode', generator: 'assigned') } } 当您尝试检索实例时,您会得到: | Error 2

我们在GORM中有一些遗留数据库映射,还有一些映射有一个主键,即枚举。枚举是使用字符串值而不是序数存储的

例如:

class AccountingGLMap {
    AccountingTypeCode id
    String typeCode

    static mapping = {
        id(column: 'accountingTypeCode',  generator: 'assigned')
    }
}
当您尝试检索实例时,您会得到:

| Error 2012-02-23 10:32:41,319 [pool-5-thread-1] ERROR context.GrailsContextLoader  - Error executing bootstraps: could not deserialize; nested exception is org.hibernate.type.SerializationException: could not deserialize
我已经验证了表中的值是否正确映射到给定的枚举中(我可以用枚举实例化对象,只要它不是主键)。如果我们将枚举更改为字符串,则一切正常

我确实看到过一篇文章,声称在使用JPA时不能使用Enum作为主键,但即使这样也有争议

有人有这方面的经验吗


编辑:作为参考,我们正在对Oracle数据库使用2.0.1。

键入:“string”
添加到您的id映射中,然后为id添加一个setter,该setter接受如下字符串输入:

class AccountingGLMap {
    AccountingTypeCode id
    GLTypeCode glTypeCode

    static mapping = {
        id(column: 'accountingTypeCode', type: 'string', generator: 'assigned')
    }

    void setId(String value) {
        id = value
    }
}

我只是尝试使用内存数据库在Grails1.3.7中实现这一点,我没有遇到任何问题。您使用的是什么版本的Grails和什么类型的数据库?对不起,应该提到的是,我们在Oracle中使用的是2.0.1。它似乎只有在枚举是键时才会中断,否则映射工作正常。