我有一个带有 hibernate 自定义用户类型的枚举:
enum Program { ABC(1000), XYZ(1001); final long code; ... }
class ProgramUserType implements org.hibernate.usertype.UserType { ... }
ProgramUserType 存储枚举的代码(1000、1001 等),并在从数据库读取时通过代码获取枚举实例。
这已在域类中的关系上成功使用:
class MyDomainOne {
Program program
...
static mapping = {
...
program column: 'PROGRAM_ID', type: ProgramUserType
...
}
}
所以,以上所有内容都可以正常工作。
但我想在 hasMany 关系中使用枚举:
class MyDomainTwo {
...
static hasMany = [
programs: Program
]
...
static mapping = {
...
programs joinTable: [name: 'BLAH_DOM_TWO_PROGS', key: 'DOM_TWO_ID', column: 'PROGRAM_ID']
...
}
}
我的问题是总是生成一个“varchar2(255 char)”类型的列:
BLAH_DOM_TWO_PROGS (DOM_TWO_ID number(19,0) not null, PROGRAM_ID varchar2(255 char));
我尝试了各种方法但没有成功:
programs joinTable: [name: 'BLAH_DOM_TWO_PROGS', key: 'DOM_TWO_ID', column: 'PROGRAM_ID', type: ProgramUserType]
programs joinTable: [name: 'BLAH_DOM_TWO_PROGS', key: 'DOM_TWO_ID', column: 'PROGRAM_ID', type: ProgramUserType, sqlType: 'NUMBER(10,0)']
programs type: ProgramUserType, joinTable: [...]
等等
在连接表映射中使用自定义用户类型的正确语法是什么?
(我使用的是 grails 2.3.7)
请您参考如下方法:
我不知道你为什么要做这个复杂的事情,但是为了将代码(整数,长整型,字符串...)从枚举写入数据库的列,你可以像这样简单地实现:
enum Program {
ABC(0, "ABC"),
XYZ(1, "XYZ"),
final String value
final Integer id
Program(Integer value, String selectValue) {
this.id = value
this.value = selectValue
}
//https://github.com/tudor-malene/Easygrid/issues/22
//shows value in select drop down
String toString() { value }
//stores value in database
Integer getId() { id }
//returns Enum constant associated with value
String getKey(){ name() }
}
重要的代码行是Integer getId() { id } 您可以将 id 属性更改为您想要的任何类型。 希望对您有帮助




