我正在尝试在Grails中创建双向多对一关系,并在两个方向上进行非级联删除。我的域名如下:
class Asset {
static hasMany = [ hosts: Host ]
static mapping = {
hosts cascade: 'save-update'
}
}
class Host {
Asset asset
}
这在删除主机(资产保留)时工作正常,但是当我尝试删除资产时,我从数据库中收到完整性约束错误。我已经尝试更改Host类定义以使用belongsTo,但无法使其工作。任何帮助都会很棒!谢谢!
答案 0 :(得分:0)
您拥有包含以下规则/属性的父级(资产)和子级(主机):
你的困境是你希望能够删除父母 - 但你会违反规则#2。即使有地图表,我也不认为你可以做你想要的。我从来没有这个用例,如果没有重新设计过多的现有模型,我猜你必须:
答案 1 :(得分:0)
这是一种many-to-many关系,在GORM中实际上可以按照您的方式运作:您可以将hosts
添加到Asset
所有者,并安全地删除Asset
影响hosts
。
答案 2 :(得分:0)
我最终通过为Asset控制器编写自己的delete()动作来找到解决方案,该操作在删除资产本身之前删除了所有主机对资产的所有引用:
def delete() {
def assetInstance = Asset.get(params.id)
assetInstance.hosts.each { theHost ->
theHost.asset = null
theHost.save()
}
if(!assetInstance.hasErrors() && assetInstance.delete()) {
redirect(action: "list")
}
else {
redirect(url: "/asset/show?id=${assetInstance.id}")
}
}
这样可以消除错误,并且还可以防止在删除父项(资产)时删除子项(主机)。