gpt4 book ai didi

hibernate - 在Grails/GORM中为名称-值对的集合建模

转载 作者:行者123 更新时间:2023-12-02 15:22:40 24 4
gpt4 key购买 nike

在我的Grails应用中,我有一个域类,其属性类型为Map,它将是一个名称/值对的集合(所有名称和值都是字符串)

class OauthProfile {
String name
// other properties omitted
Map claims
}

当我查看为此模型生成的表时,它们看起来像这样:
mysql> describe oauth_profile;
+--------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+----------------+
| id | bigint(20) | NO | PRI | NULL | auto_increment |
| version | bigint(20) | NO | | NULL | |
| name | varchar(255) | NO | | NULL | |
+--------------+--------------+------+-----+---------+----------------+

mysql> describe oauth_profile_claims;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| claims | bigint(20) | YES | | NULL | |
| claims_idx | varchar(255) | YES | | NULL | |
| claims_elt | varchar(255) | NO | | NULL | |
+------------+--------------+------+-----+---------+-------+

这种模式的问题在于,在数据库级别, oauth_profileoauth_profile_claims之间没有关系,这意味着可以删除 oauth_profile中的行,而不必同时删除 oauth_profile_claims中的关联行。

有没有一种方法可以对 claims进行建模,从而在两个表之间建立显式关系?

最佳答案

您可以做的是创建一个显式的域类型,并执行hasMany <-> EmiratesTo关联,如下所示:

class OauthProfile {
String name
static hasMany = [claims: OauthProfileClaim]
}

class OauthProfileClaim {
String name
String value
static belongsTo = [oauthProfile: OauthProfile]
}

它使您可以像其他gorm关系一样定义cascase行为(请参阅 docs)。在具有hasMany <-> includesTo关系的默认行为中,您将得到 docs中所说的 save update delete行为:

The default cascading behaviour is to cascade saves and updates, but not deletes unless a belongsTo is also specified:

关于hibernate - 在Grails/GORM中为名称-值对的集合建模,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32841916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com