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:使用字符串作为键的一对一表映射的主要内容,如果未能解决你的问题,请参考以下文章