groovy grails / GORM /hib- hasManyMap未在父对象的保存()上同步

bxjv4tth  于 2023-03-17  发布在  Go
关注(0)|答案(2)|浏览(217)

删除关联实体并将此更改保留到数据库时出错。
有一个groovy对象parent,它有很多child实体。当我们找到这个域对象并将列表设置为null,然后调用保存(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(最新版本)。

ahy6op9u

ahy6op9u1#

static mapping = 
{
   childs cascade: "all"
}

这个很好用。

xxe27gdn

xxe27gdn2#

首先,你应该使用child.delete(flush:true)而不是assign null。这是不合适的。(为之前的错误道歉)
我推荐你阅读彼得莱德布鲁克系列:http://blog.springsource.com/2010/07/02/gorm-gotchas-part-2/。在您的情况下,请搜索“删除子项”
更新:如果你还没有读过上面的文章(特别有用):
要删除一个子集合,首先需要将它从父集合中移除,然后再删除它。但是由于使用了belongsTo关系,这会导致属性不为空异常。
解决方案:您可以将此添加到父类中:

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

上面的Map将帮助删除所有没有父节点的子节点。

parent.childs.clear()

相关问题