Hibernate 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 } 当删除主机(资产保留)时,这可以正常工作,但当我尝试删除资产时,数据库中会出现完整性约束错误。我已尝试将宿主类定义更改

我试图在Grails中创建一个双向多对一关系,并在两个方向上进行非级联删除。我的域名看起来像:

class Asset {
  static hasMany = [ hosts: Host ]

  static mapping = {
      hosts cascade: 'save-update'
  }
}

class Host {
  Asset asset
}
当删除主机(资产保留)时,这可以正常工作,但当我尝试删除资产时,数据库中会出现完整性约束错误。我已尝试将宿主类定义更改为使用belongsTo,但无法使其正常工作。任何帮助都会很好!谢谢

您有具有以下规则/属性的父(资产)和子(主机)类:

  • 父母有孩子
  • 没有父项,子项不能存在(双向)
  • 父级无法删除子级
  • 你的困境是你希望能够解除父母的职务,但你将违反规则2。即使有一个映射表,我也不认为你能做到你所要求的。我从未使用过这个用例,如果不重新设计太多当前模型,我猜您必须:

  • 正如@JamesKleeh指出的-允许在Host.asset上为null-基本上,子级可以在没有父级的情况下存在
  • 或允许父级删除子级(即级联删除)

  • 这是一种关系,在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正常工作,但如果用户意外删除了一个资产(分配了许多主机),则可能会出现问题。