Hibernate Grails一对多删除,无需级联
我试图在Grails中创建一个双向多对一关系,并在两个方向上进行非级联删除。我的域名看起来像:Hibernate Grails一对多删除,无需级联,hibernate,grails,gorm,Hibernate,Grails,Gorm,我试图在Grails中创建一个双向多对一关系,并在两个方向上进行非级联删除。我的域名看起来像: class Asset { static hasMany = [ hosts: Host ] static mapping = { hosts cascade: 'save-update' } } class Host { Asset asset } 当删除主机(资产保留)时,这可以正常工作,但当我尝试删除资产时,数据库中会出现完整性约束错误。我已尝试将宿主类定义更改
class Asset {
static hasMany = [ hosts: Host ]
static mapping = {
hosts cascade: 'save-update'
}
}
class Host {
Asset asset
}
当删除主机(资产保留)时,这可以正常工作,但当我尝试删除资产时,数据库中会出现完整性约束错误。我已尝试将宿主类定义更改为使用belongsTo,但无法使其正常工作。任何帮助都会很好!谢谢 您有具有以下规则/属性的父(资产)和子(主机)类:
这是一种关系,在GORM中,它实际上会以您想要的方式工作:您可以将
主机
添加到资产
所有者,并安全地删除资产
,而不会影响主机
我最终通过编写自己的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}")
}
}
这样可以消除错误,并防止在父级(资产)被删除时删除子级(主机)已删除。您使用的数据库是什么?请尝试在
主机的资产
属性上添加nullable:true
?我正在本地开发中使用hsqldb。我已将其设置为nullable:true,但无法理解为什么仍然出现错误。是否尝试删除“hosts cascade:'save update'”和添加belongsTo?我尝试在主机上添加belongsTo[asset:asset]并删除asset中的级联定义,但在尝试删除资产时仍会收到错误消息。我尝试获取您的解决方案#1,但可为nullable:true仍会导致错误消息。我设法使解决方案#2正常工作,但如果用户意外删除了一个资产(分配了许多主机),则可能会出现问题。