一尘不染

Grails-将多对多父/子关系映射到单个联接表

hibernate

我的问题基于以下(简化的)Grails域类

class Dimension {

    String name

    static hasMany = [
        children: Dimension,
        parents: Dimension
    ]
}

有没有办法将多对多的父母/孩子关系映射到单个联接表?


阅读 231

收藏
2020-06-20

共1个答案

一尘不染

据我所知,唯一的方法就是 创建另一个 表示父子关系的 域类

class DimensionDependency {
  Dimension parent
  Dimension child

  static belongsTo = Dimension
}

class Dimension {
  static hasMany = [parentDependencies: DimensionDependency]
  static mappedBy = [parentDependencies: 'child']
  static mapping = { parentDependencies cascade: 'all-delete-orphan' }
}

mappedBy关键字指定对象指的一个DimensionDependency是永远的孩子。通过all-delete- orphan在映射中指定,我们确保parentDependency从子级删除a时,DimensionDependency将从数据库中删除关联的对象。

您还可以在Dimension类中添加便捷方法来封装上的操作DimensionDependencies,以使界面更像GORM。

  static transients = ['children', 'parents']

  Set<Dimension> getChildren()
  {
    AssignmentDependency.findAllByParent(this).child
  }

  Set<Dimension> getParents()
  { 
    parentDependencies?.parent ?: []
  }

  Dimension addToParents(Dimension parent)
  {
    if (!parentDependencies.find { it.parent == parent && it.child == this })
    {
      addToParentDependencies(new DimensionDependency(parent: parent, child: this))
    }
    return this
  }

  Dimension removeFromParents(Dimension parent)
  {
    def dep = parentDependencies.find { it.parent == parent }
    removeFromParentDependencies(dep)
    dep.delete(flush: true)
    return this
  }

我使用这种方法已有一段时间了,到目前为止没有遇到任何麻烦。

2020-06-20