Grails一对多删除没有级联

时间:2013-08-21 02:18:18

标签: hibernate grails gorm

我正在尝试在Grails中创建双向多对一关系,并在两个方向上进行非级联删除。我的域名如下:

class Asset {
  static hasMany = [ hosts: Host ]

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

class Host {
  Asset asset
}

这在删除主机(资产保留)时工作正常,但是当我尝试删除资产时,我从数据库中收到完整性约束错误。我已经尝试更改Host类定义以使用belongsTo,但无法使其工作。任何帮助都会很棒!谢谢!

3 个答案:

答案 0 :(得分:0)

您拥有包含以下规则/属性的父级(资产)和子级(主机):

  1. 父母有孩子
  2. 没有父母(双向)儿童不能存在
  3. 父母无法移除儿童
  4. 你的困境是你希望能够删除父母 - 但你会违反规则#2。即使有地图表,我也不认为你可以做你想要的。我从来没有这个用例,如果没有重新设计过多的现有模型,我猜你必须:

    1. 正如@JamesKleeh所指出的那样 - 在Host.asset上允许可为空 - 基本上没有父母的孩子可以存在
    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}")
    }
}

这样可以消除错误,并且还可以防止在删除父项(资产)时删除子项(主机)。