2010-11-30 51 views
1

刪除關聯實體並將此更改持久保存到數據庫時出現問題。grails/GORM/hibernate - hasMany地圖在父級的save()上不同步

有一個groovy對象其中有很多實體與它關聯。當我們找到這個域對象並將此列表設置爲null時,並且調用 .save(flush:true) 元素保留在數據庫中。本來預計這些已被刪除。任何建議都會很棒。

class Parent {

static hasMany = [child:Child] ... }

和兒童:

class Child {

belongsTo = [Parent] ... }

我們添加的元素和刪除:

 
def child = new Child()

def parent = new Parent(child:child)

parent.save(flush:true) def id = parent.id //from saved entity

/// in separate transaction

parent = Parent.get(id) //id from above parent.child = null

parent.save(flush:true)

// check database - child reference still there - expect to have been deleted

什麼,我們已經做了錯誤的將任何建議讚賞。使用grails 1.3.5(最新版本)。

回答

4

第一件事情,你應該使用child.delete(沖水:真),而不是分配無效。這只是不合適的。 (對不起,以前的錯誤)

我建議你閱讀彼得Ledbrook系列:http://blog.springsource.com/2010/07/02/gorm-gotchas-part-2/。在你的情況下,搜索「刪除兒童」

更新:如果你還沒有看過上面的文章(特別有用):

要刪除一個孩子,你首先需要從父集合中刪除它,然後刪除它。但是,由於您使用belongsTo關係,它會導致屬性不爲null異常。

解決方法:您可以添加到這個父類:

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

上述映射將幫助刪除所有的孩子沒有父母。然後你可以使用

parent.childs.clear() 
+1

非常好的答案。閱讀博客 - 這是值得的! – sbglasius 2010-12-01 11:53:40

0
static mapping = 
{ 
    childs cascade: "all" 
} 

能正常工作。