Grails - 具有级联删除的同一类的多个belongsTo

时间:2009-09-03 16:41:41

标签: grails groovy foreign-keys cascading-deletes

这个是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做某种方式吗?

非常感谢您的时间和任何帮助。

2 个答案:

答案 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建议的均匀方法