这个是Grails的用户。我在grails - 用户邮件列表上问了这个问题,但我想,因为我已经和我斗争了几天,所以我应该尽可能地扩大网络。
我在尝试模拟两者之间的关系时遇到了一些困难 引用该对象的另一个对象(不同类型)中相同类型的对象 两个对象。
作为我正在尝试做的一个例子,假设 你在建立家庭成员之间的关系。任何给定的关系 “belongsTo”两个不同的家庭成员。所以:
class Person {
hasMany[relationships: Relationship]
static mappedBy = [relationships:'p1', relationships:'p2']
}
class Relationship {
Person p1
Person p2
String natureOfRelationship // for example, "cousins"
static belongsTo = [p1: Person, p2: Person]
}
这里的意图是如果p1或p2被删除,那么删除将会 级联到hasMany映射中的所有Relationship对象。相反,每一次 我试了一下,最后我违反了外键。我试过用了 文档中包含的“cascade”属性:
http://grails.org/doc/1.0.x/guide/single.html#5.5.2.9%20Custom%20Cascade%20Behaviour
所以我想我会把它添加到Person类:
static mapping = {
relationships cascade:'delete'
}
我也没有任何运气。
我还查看了Grails生成的devDB.script文件,看看它是怎么回事 在关系上设置外键。如果我手动添加“开启” 删除CASCADE“到两个外键约束,然后它工作正常,但是 显然是对自动生成的数据库脚本进行手动编辑 不是最强大的解决方案。理想情况下,我希望能够指定 使用GORM的行为。
那么这里最好的选择是什么?有没有办法强制级联删除 多个外键/所有者?我是否需要手动执行此操作 onDelete对人的行为?我需要进入Hibernate配置吗? 这个,或者我可以用Grails / GORM做某种方式吗?
非常感谢您的时间和任何帮助。
答案 0 :(得分:1)
您可以向Person类添加beforeDelete挂钩并查询另一个父级。如果另一个父项不存在,则可以删除该关系。请注意,您正在遇到外键违规,因为您可能需要删除两个父项,因为该关系对它们都有FK。
答案 1 :(得分:0)
您还可以在Person中定义2个Relationshipcollections
incomingRelations和outgoingRelations似乎可用于区分(如果适用于您的域)。
你可以用一个getter定义一个瞬态属性关系,它返回两个relationshipcollections的联合(一个不可变的,一定不要修改它/那些改变很可能没有意义)
class Person {
Relationship incomingRelations
Relationship outgoingRelations
static mappedBy = [incomingRelations:'p1', outgoingRelations:'p2']
static transients = ['relations']
Set getRelations() {
//creates a new collection as union of the old ones
return Collections.unmodifiableSet(this.incomingRelations + this.outgoingRelations)
}
}
class Relationship {
static belongsTo = [p1:Person, p2:Person]
}
如果不合适,我会尝试Miguel-Ping建议的均匀方法