Grails / GORM / Hibernate - карта hasMany не синхронизируется при сохранении () родительского - PullRequest
1 голос
/ 30 ноября 2010

Проблема с удалением связанных объектов и сохранением этого изменения в базе данных.

Имеет Groovy объект parent , с которым связано множество child сущностей. Когда мы находим этот объект домена и устанавливаем для этого списка значение null, и вызываем parent .save (flush: true) дочерние элементы остаются в базе данных. Ожидал бы, что они были удалены. Любые предложения будут великолепны.

class Parent {</p> <p>static hasMany = [child:Child] ... }

и ребенок:

class Child {</p> <p>belongsTo = [Parent] ... }

добавляем элемент и удаляем:

def child = new Child()</p> <p>def parent = new Parent(child:child)</p> <p>parent.save(flush:true) def id = parent.id //from saved entity</p> <p>/// in separate transaction</p> <p>parent = Parent.get(id) //id from above parent.child = null</p> <p>parent.save(flush:true)</p> <p>// check database - child reference still there - expect to have been deleted

Любые предложения о том, что мы сделали неправильно, будут оценены. используя grails 1.3.5 (последняя версия).

Ответы [ 3 ]

4 голосов
/ 01 декабря 2010

Во-первых, вы должны использовать child.delete (flush: true) вместо присвоения нуля.Это просто не ценит.(извините за предыдущую ошибку)

Рекомендую прочитать серию Питера Ледбрука: http://blog.springsource.com/2010/07/02/gorm-gotchas-part-2/.В вашем случае выполните поиск «Удаление детей»

Обновление: если вы все еще не читали вышеупомянутую статью (особенно полезную):

Чтобы удалить ребенка, сначала необходимо удалить его изродительскую коллекцию, затем удалите ее.Но это приведет к тому, что свойство не станет пустым исключением, поскольку вы используете отношение ownTo.

Решение: вы можете добавить это в родительский класс:

static mapping = {
 childs cascade: "all-delete-orphan"
}

Приведенное выше сопоставление поможет удалить все дочерние элементы, которые неу меня нет родителя.Тогда вы можете использовать

parent.childs.clear()
0 голосов
/ 01 декабря 2010
static mapping = 
{
   childs cascade: "all"
}

это отлично работает.

0 голосов
/ 30 ноября 2010

Начните с документации.

Вам необходимо поиграть с настройками каскада.

Выезд

http://www.grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html

раздел 5.5.2.9

...