Определение отношения
То, что вы определяете, является однонаправленным один-ко-многим, причем родитель является «владельцем» отношений. Если вы определите это так:
class RoleType {
String roleName
String description
static hasMany = [children: RoleType]
}
Тогда вы можете сделать что-то вроде этого:
def superManager = new RoleType(roleName: 'SuperManager')
def manager = new RoleType(roleName: 'Manager')
superManager.addToChildren(manager);
Или я верю, что вы можете записать одно и то же:
def superManager = new RoleType(roleName: 'SuperManager').addToChildren(roleName: 'Manager').save()
Определяя отношения с [children: RoleType]
, Grails создает коллекцию в домене с именем children
, к которой вы можете получить доступ, как и к любому другому свойству, например, myRole.children.each { it.doSomething() }
.
Чтобы упростить работу, вы также можете сделать отношение двунаправленным, добавив следующее свойство:
RoleType parent
Если вы используете динамические методы addTo*
, они должны гарантировать, что оба конца отношения правильно установят свои свойства. Посмотрите на это для дополнительной справки.
Восстановление всех потомков
У вас есть несколько вариантов, но я не думаю, что в GORM есть способ сделать это автоматически.
Один из вариантов - написать собственный рекурсивный или итеративный метод, который захватывает и собирает все дочерние элементы. Пример этого можно найти здесь .
В качестве альтернативы, если вы часто выполняете этот метод, и он становится узким местом, вы можете выполнить некоторые ручные манипуляции с вашей базой данных. У вас могут быть триггеры, которые работают со вставками и обновлениями в вашей таблице RoleType, которые поддерживают списки неявных связей между всеми типами RoleType.
Например, если вы создаете отношение RoleType A
-> RoleType B
-> RoleType C
, триггеры могут создать (в отдельной таблице) a RoleType A
-> RoleType B
, RoleType A
-> RoleType C
и RoleType B
-> RoleType C
отношения. Затем вы можете запросить эту таблицу одним родителем и получить все ее предполагаемые потомки / потомки. Я видел это сделано для сложной обработки ACL.