在我的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_profile
和oauth_profile_claims
之间没有任何关系,这意味着可以删除{{}中的行1}}但不删除oauth_profile
中的相关行。
有没有办法对oauth_profile_claims
进行建模,以便两个表之间存在明确的关系?
答案 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< - >的默认行为中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'];
}
(再次,未经测试但值得尝试)