Grails - сопоставление отношения родителей и детей «многие ко многим» к единой таблице соединений - PullRequest
4 голосов
/ 20 марта 2012

Мой вопрос основан на следующем (упрощенном) классе домена Grails

class Dimension {

    String name

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

Есть ли способ сопоставить отношения «многие ко многим родителям / детям» с одной таблицей соединений?

1 Ответ

7 голосов
/ 20 марта 2012

Насколько я знаю, единственный способ сделать это - создать еще один класс домена , который представляет отношения родитель-потомок.

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 удаляется из базы данных.

Вы также можете добавить удобные методы к вашему 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
  }

Я использовал этот подход в течение некоторого времени и до сих пор не испытывал проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...