删除关联实体并将此更改保留到数据库时出现问题。
有一个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(最新版本)。
答案 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"
}
这很好。