【问题标题】:Grails - multiple belongsTo of same class with cascading deletionGrails - 具有级联删除的同一类的多个属于
【发布时间】:2010-11-25 08:47:02
【问题描述】:

这里是为 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 对 Person 的操作?我是否需要进入 Hibernate 配置 这个,还是我可以在 Grails/GORM 中以某种方式做到这一点?

非常感谢您抽出宝贵的时间以及您能提供的任何帮助。

【问题讨论】:

  • 戴夫,你是怎么解决这个问题的?我认为即使是代码:static mappedBy = [relationships:'p1',relationships:'p2'] 也是有问题的

标签: grails groovy foreign-keys cascading-deletes


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您还可以在 Person 中定义 2 个关系集合

    incomingRelations 和 outcomingRelations 似乎可以用来区分(如果适用于您的域)。

    您可以仅使用 getter 定义瞬态属性关系,它返回两个关系集合的联合(确保不修改它的不可变对象/这些更改很可能没有意义)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      相关资源
      最近更新 更多