Использование hasMany по сравнению с ownTo больше относится к каскадному поведению, которое вы хотите указать, когда происходит обновление / удаление. Во втором примере для каскадирования установлено значение ALL на дочерней стороне и NONE на родительской стороне. Если вы удалите ребенка, с родителем ничего не произойдет. Если вы удалите родителя, все дети будут автоматически удалены.
В вашем первом примере для каскадирования установлено значение ALL на родительской стороне и SAVE-UPDATE на дочерней стороне. Так что теперь вы можете сделать что-то вроде:
parent.addToChildren(child1)
parent.addToChildren(child2)
parent.addToChildren(child3)
parent.save(flush:true)
И когда вы сохраните родительский элемент, все дочерние элементы будут обновлены.
Касаясь чего-то, чего вы не просили, вы также можете предположить что-то вроде:
class Parent { hasMany = [children:Child] }
class Child { Parent parent }
Если вы определите отношения между дочерним элементом и родительским способом таким образом, вам потребуется вручную управлять дочерними объектами, которые ссылаются на родительского элемента при удалении родительского элемента *. (* это исправляет предыдущее утверждение, которое оказалось неточным)
Итак, hasMany / ownTo имеет два основных соображения:
- Какую каскадную стратегию вы хотите выполнить при обновлении / удалении
- Как вы, скорее всего, собираетесь обращаться к данным, если вы ожидаете, что вам нужно получить набор потомков для родителя, использование метода parent.getChildren () довольно удобно.
UPDATE:
Я также хочу уточнить, GORM не будет загружаться при использовании hasMany; по умолчанию GORM использует стратегию отложенного выбора, поэтому он не получит дочерние элементы до тех пор, пока не будет предпринята попытка доступа к parent.children
Если вы хотите, чтобы по умолчанию с нетерпением выбиралась связь, вы можете указать соответствующее отображение:
class Parent {
hasMany = [children:Child]
static mapping = {
children lazy:false
}
}
Наконец, вы упомянули, что вам не нравится, что вам нужно беспокоиться о addTo / removeFrom на стороне hasMany. Вам не нужно делать это, если вы сохраняете с помощью flush: true.
def parent = Parent.get(id)
def child = new Child(name:'child1', parent:parent)
if(child.save(flush:true)) {
// both sides of the relationship should be good now
}
РЕДАКТИРОВАТЬ: исправлен обратный порядок значений по умолчанию для дочернего / родительского каскада и исправлено неправильное представление о том, как Горм обрабатывает отношения без принадлежности.