Hibernate 在Grails中使用Groovy枚举作为Id字段
我们在GORM中有一些遗留数据库映射,还有一些映射有一个主键,即枚举。枚举是使用字符串值而不是序数存储的 例如: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
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。它似乎只有在枚举是键时才会中断,否则映射工作正常。