Как класс домена может передавать каскад ‘all-delete-orphan’ дочернему элементу, на который у него нет ссылки?

#grails #grails-orm #grails-domain-class #all-delete-orphan

#grails #grails-orm #grails-domain-class #all-delete-orphan

Вопрос:

В Grails у вас может быть дочерний класс:

 class Child {
    Father father
    static belongsTo = [Father, Mother]
}
  

С двумя родительскими классами

 class Mother{
}

class Father { 
}
  

Похоже, что если I father.delete() , то Grails выдает ошибку базы данных, в которой говорится, что Father не может быть удален, поскольку child все еще существует.

Как мне каскадировать all-delete-orphan Child , если Father класс не имеет прямой ссылки на Child класс?

Ответ №1:

Сделайте его двунаправленным, используя hasMany.

 class Mother{
  static hasMany = Child
}
class Father{
  static hasMany = Child
}
  

Выполнение этого должно заставить каскадную работу работать таким образом, что при удалении одного из родителей дочерний элемент также будет удален.

Комментарии:

1. Удалит ли это, Father если Child удалено, потому что я пытаюсь избежать этого?

2. нет, этого не произойдет, поскольку отношение «отец-потомок» — это отношение «один ко многим», удаление дочернего элемента не приведет к удалению отца.

3. Спасибо за все, с чем у меня возникли проблемы, так это с тем, как это сделать с параметром карты hasMany.

4. Если дочерний элемент принадлежит КАК отцу, так и матери, и если отец удален, есть ли способ предотвратить удаление дочернего элемента?

Ответ №2:

У Питера Ледбрука есть хорошая статья, в которой рассматриваются ошибки GORM, часть 2

Я не смог заставить работать часть, принадлежащую только ему, но это работает для меня:

 class Father {
  static hasMany = [children: Child]
}

class Child {
  static belongsTo = [father: Father]
}

void testDeleteItg() {
    def father = new Father().save()
    def child = new Child()
    father.addToChildren child
    child.save()
    def childId = child.id

    father.delete(flush:true)
    assertNull(Child.get(childId))
}
  

Комментарии:

1. static hasMany = Child Будет работать вместо static hasMany = [children: Child] ?