#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]
?