在Grails / GORM中建模一组名称 - 值对

时间:2015-09-29 10:46:17

标签: hibernate grails gorm

在我的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之间没有任何关系,这意味着可以删除{{}中的行1}}但不删除oauth_profile中的相关行。

有没有办法对oauth_profile_claims进行建模,以便两个表之间存在明确的关系?

2 个答案:

答案 0 :(得分:1)

您可以做的是创建一个显式域类型并执行hasMany< - > belongsTo这样的协会:

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

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

允许您像任何其他gorm关系一样定义cascase行为(请参阅docs)。在hasMany&lt; - &gt;的默认行为中belongsTo关系,您将获得save中所述的update delete <body> <div id="photoCover"> <nav id="menu" class="menu"> <a href="#" class="menu-trigger"><span>Menu</span></a> </nav> </div><!--photoCover--> <div id="entryMenu"></div><!--entryMenu--> </body> 行为:

  

默认级联行为是级联保存和更新,但不删除,除非还指定了belongsTo:

答案 1 :(得分:0)

我没有尝试Map字段,但它适用于对象。你可以使用embedded属性

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

    static embedded = ['claims'];
}

(再次,未经测试但值得尝试)