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

标签 hibernate grails groovy nhibernate-mapping grails-orm

我的问题基于以下(简化的)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永远是 child 。通过指定 all-delete-orphan在映射中,我们确保在删除 parentDependency 时来自一个 child ,相关的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
  }

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

关于hibernate - Grails - 将多对多父/子关系映射到单个连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9782999/

相关文章:

mysql - 如何在 Hibernate 中为每个公司创建一个 customerNumber 生成器

java - 从 Gradle 执行 Groovy 脚本而不编译 Java

java - 如何在 Groovy 中将 XML 转换为对象并插入到 MongoDB 集合中?

java - Hibernate语法错误: Expected DOT

java - 如何找出一个实体是否在 JPA/Hibernate 中分离?

java - 如何在 CDI 环境中管理 EntityManager 生命周期(使用 Tomcat)

grails - 为什么类名长度为一时,生成的 Controller 中没有注入(inject)服务?

grails - 如何在 Grails Bootstrap 中添加启用审计跟踪的用户?

javascript - ajax 加载中拒绝访问 (Grails)

groovy - 如何在自定义类中使用构建脚本依赖项?