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

Hibernate Grails—将多对多父/子关系映射到单个联接表,hibernate,grails,groovy,nhibernate-mapping,gorm,Hibernate,Grails,Groovy,Nhibernate Mapping,Gorm,我的问题基于以下(简化的)Grails域类 class Dimension { String name static hasMany = [ children: Dimension, parents: Dimension ] } 有没有办法将多对多父/子关系映射到单个联接表?据我所知,唯一的方法是创建另一个表示父-子关系的域类 class DimensionDependency { Dimension parent Dimen

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

class Dimension {

    String name

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

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

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

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
时,关联的
DimensionDependency
会从数据库中删除

您还可以向
维度
类添加方便的方法,以封装
维度依赖项
上的操作,使接口更像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
  }
static transients=['children','parent']
Set getChildren()
{
AssignmentDependency.findAllByParent(this).child
}
设置getParents()
{ 
父依赖项?.parent?:[]
}
维度addToParents(维度父级)
{
如果(!parentDependencies.find{it.parent==parent&&it.child==this})
{
addToParentDependencies(新维度相关性(父:父,子:此))
}
还这个
}
维度从父维度移除(维度父维度)
{
def dep=parentDependencies.find{it.parent==parent}
removeFromParentDependencies(dep)
副删除(刷新:真)
还这个
}
我已经使用这种方法一段时间了,到目前为止还没有遇到任何问题