我有一个带有 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 属性更改为您想要的任何类型。 希望对您有帮助

一些引用链接GRAILS-3633in another discussion


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!