GORM:使用字符串作为键的一对一表映射

Posted

技术标签:

【中文标题】GORM:使用字符串作为键的一对一表映射【英文标题】:GORM: one-to-one table mapping using string as a key 【发布时间】:2013-08-15 19:30:32 【问题描述】:

我正在尝试创建一对具有一对一映射的 GORM 域对象,但需要注意的是两个表之间的键不是长的,而是 UUID 字符串/varchar。我到处寻找关于如何在 grails/gorm 中执行此操作的讨论,发现了一些问题,但没有使用答案。这是我的两门课,希望有人能指点我一个合理的方向。

谢谢。

class ItemLastChange  
    static belongsTo = [item: Item]

    static mapping = 
        cache true
        version false
        id column: 'item_hash_msb', name: 'itemHashMsb'
        item column: 'item_uuid', key: 'uuid', sqlType: 'text', type: 'text', insertable: false, updateable: false
    

    static constraints = 
    

    long itemHashMsb;
    String itemUuid;
    String itemMapCode;
    String dbActionType;
    String version;
    Calendar modificationDate;


class Item 
    static hasOne = [itemLastChange: ItemLastChange]

    static mapping = 
        cache true
        version false
        id column:'item_id'

        columns 
            itemLastChange column: 'uuid', lazy: false, key: 'item_uuid', type: 'text', insertable: false, updateable: false
        

    

    static constraints = 
    

    ItemLastChange itemLastchange

    long id
    String uuid
    //other fields eliminated

...由于与现有数据和表格等相关的原因,让 ItemLastChange 表格使用 item_id,因为 FK 不是一个可行的解决方案(正如我们所希望的那样......)

这会导致以下错误:

java.sql.SQLException:getLong() 的值无效 - '6890daf634873fbaac307cad258561be'

其中值 '6890daf634873fbaac307cad258561be' 是 ItemLastChange 表中的 varchar UUID。

以下每个 cmets,这是一个粗略的架构:

Item
----
Field       Type *      Collation   Null    Key     
item_id     int(11)             NO  PRI
item_type_id    int(11)     null      YES MUL 
organization_id int(11)     null      YES MUL 
item_map_code   varchar(36) utf8_bin    YES     
uuid        char(32)    utf8_bin    NO  UNI 
name        varchar(64) utf8_bin    NO      
...

ItemLastChange
--------------
Field       Type        Collation   Null    Key
item_hash_msb   bigint(20)          NO  PRI
item_uuid       varchar(32) utf8_bin    NO  UNI
item_map_code   varchar(36) utf8_bin    NO  
db_action_type  varchar(64) utf8_bin    NO  
item_version    varchar(16) utf8_bin    NO  
description     longtext    utf8_bin    YES 
ine_app_version varchar(16) utf8_bin    YES 
creation_date   datetime            NO  
modification_date   datetime            NO  

这些表之间没有定义的 FK 关系。

提前致谢。

-斯蒂顿

【问题讨论】:

发布表的架构。 你遇到了什么错误? 对不起,暂时离开这个问题......(不知何故没有看到你的回复......无论如何,我得到的错误是:java.sql.SQLException:Invalid value for getLong() - '6890daf634873fbaac307cad258561be' 看来,由于关系是由 varchar 键定义的,因此系统假设关系的列必须是长的。 不应该将id定义为Item中的String吗? (字符串 ID) 【参考方案1】:

尝试将您的 id 声明为字符串:

String id

static mapping = 
    [...]
    id column:'item_id', generator: 'assigned'
    [...]

【讨论】:

我无法将我的 id 声明更改为 String,但我会尝试将 ID 列从 long 更改为 uuid 列,看看是否可行。

以上是关于GORM:使用字符串作为键的一对一表映射的主要内容,如果未能解决你的问题,请参考以下文章

hibernate笔记--基于主键的单(双)向的一对一映射关系

具有复合键的一对多注释映射

作为映射键的字符串枚举不适用于 ReturnType

带有向量作为键的 STL 映射

hibernate 之 关联映射的基于外键的单向一对一映射

Grails Mongo GORM 插件 - 浮点和字节的映射是字符串而不是数字