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

7 grails groovy foreign-keys cascading-deletes

这个是给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]
}
Run Code Online (Sandbox Code Playgroud)

这里的意图是如果删除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'
}
Run Code Online (Sandbox Code Playgroud)

我也没有任何运气.

我还查看了Grails生成的devDB.script文件,看看它是如何在Relationship上设置外键的.如果我手动将"ON DELETE CASCADE"添加到两个外键约束,那么它工作正常,但显然对自动生成的数据库脚本进行手动编辑并不是最强大的解决方案.理想情况下,我希望能够使用GORM指定该行为.

那么我最好的选择是什么呢?有没有办法强制多个外键/所有者的级联删除?我是否需要在Person上使用onDelete操作手动执行此操作?我是否需要进入Hibernate配置,或者我可以用Grails/GORM进行某种方式吗?

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

Mig*_*ing 1

您可以向 Person 类添加beforeDelete挂钩并查询另一个父级。如果另一个父级不存在,您可以删除该关系。请注意,您遇到了外键违规,因为您可能需要删除父母双方,因为该关系对他们两个都有 FK。