grails / GORM / hibernate - hasMany map在父级的save()上未同步

时间:2010-11-30 19:11:16

标签: hibernate grails groovy associations gorm

删除关联实体并将此更改保留到数据库时出现问题。

有一个groovy对象 parent ,它有许多与之关联的 child 实体。当我们找到这个域对象并将此列表设置为null,并调用 parent .save(flush:true)时 child 元素保留在数据库中。本来可以预期这些已被删除。任何建议都会很棒。

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(最新版本)。

3 个答案:

答案 0 :(得分:4)

首先,你应该使用child.delete(flush:true)而不是赋值null。这只是不合适。 (对不起以前的错误)

我建议你阅读Peter Ledbrook系列:http://blog.springsource.com/2010/07/02/gorm-gotchas-part-2/。在您的情况下,搜索“删除儿童”

更新:如果您仍未阅读上述文章(特别有用):

要删除子项,首先需要将其从父集合中删除,然后将其删除。但是由于你使用了belongsTo关系,它会导致属性非null异常。

解决方案:您可以将其添加到Parent类中:

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

上述映射将有助于删除所有没有父母的孩子。然后你可以使用

parent.childs.clear()

答案 1 :(得分:0)

从文档开始。

您需要使用级联设置。

结帐

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

第5.5.2.9节

答案 2 :(得分:0)

static mapping = 
{
   childs cascade: "all"
}

这很好。