0

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

class Asset {
  static hasMany = [ hosts: Host ]

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

class Host {
  Asset asset
}

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

4

3 回答 3

0

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

  1. 父母有孩子
  2. 没有父母,孩子就不能存在(双向)
  3. 家长不能删除孩子

您的困境是您希望能够删除 Parent - 但您将违反规则 #2。即使有一个映射表,我认为你不能做你所要求的。我从来没有遇到过这种用例,如果不重新设计你当前的模型太多,我猜你必须:

  1. 正如@JamesKleeh 指出的那样-允许在 Host.asset 上可以为空-基本上儿童可以在没有父母的情况下存在
  2. 或允许父级删除子级(即级联删除)
于 2013-08-21T05:14:33.887 回答
0

我最终通过为资产控制器编写自己的 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}")
    }
}

这消除了错误并防止在删除父级(资产)时删除子级(主机)。

于 2013-08-22T22:21:19.443 回答
0

这是一个多对多的关系,在 GORM 中它实际上会按照你想要的方式工作:你可以添加hostsAsset所有者并安全地删除Asset而不影响hosts.

于 2013-08-21T08:17:41.137 回答