Grails的 - 与级联删除同一类的多个属于关联(Grails - multiple belong

2019-08-03 14:42发布

这一个是对Grails的用户在这里。 我问它的Grails上 - 用户邮件列表,但我想,因为我一直在争取这几天我应尽可能广泛净投越好。

我有一些困难,试图在另一个对象(不同型号)同一类型的两个对象之间的关系进行建模引用两个对象。

由于什么,我试图做一个例子,假设您正在模拟家庭成员之间的关系。 任何给定的关系“属于关联”两个不同的家庭成员。 所以:

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关系的所有对象。 取而代之的是,每次我尝试它的时候,我结束了一个外键冲突。 我试着用作为覆盖的文档中的“级联”属性:

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文件,看看它是如何设置上关系的外键。 如果我手动添加“ON DELETE CASCADE”这两个外键约束,那么它工作正常,但显然这样做手动编辑自动生成的数据库脚本是不是最强大的解决方案。 理想情况下,我想能够指定使用GORM这种行为。

那么什么是我最好的选择吗? 有没有办法强制级联删除多个外键/业主? 我需要与人的onDelete操作手动做到这一点? 我需要进入休眠CONFIGS这一点,或者我可以做到这一点在Grails的/格姆某种方式?

非常感谢您的时间和您可以提供任何帮助。

Answer 1:

您可以添加beforeDelete钩Person类和查询另一方。 如果另一方不存在,你可以删除的关系。 请注意,您打外键冲突,因为你可能需要删除双方父母,因为关系有一个FK他们两个。



Answer 2:

您还可以定义在人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]
}

如果不适合,我会尝试平衡的办法由米格尔·平建议



文章来源: Grails - multiple belongsTo of same class with cascading deletion