【问题标题】:grails / GORM / hibernate - hasMany map not synchronised on save() of parentgrails / GORM / hibernate - hasMany 映射未在父节点的 save() 上同步
【发布时间】:2011-05-18 01:54:59
【问题描述】:

删除关联实体并将此更改保留到数据库时出现问题。

有一个 groovy 对象 parent,它有许多与之关联的 child 实体。当我们找到这个域对象并将这个列表设置为 null,并调用 parent.save(flush:true) child 元素保留在数据库中。本来希望这些已被删除。任何建议都会很棒。

<pre>class Parent {</pre>

静态 hasMany = [child:Child] ... }

和孩子:

<pre>class Child {</pre>

belongsTo = [父母] ... }

我们添加元素并删除:

def child = new Child()

def parent = new Parent(child:child)

parent.save(刷新:真) def id = parent.id //来自保存的实体

/// 在单独的事务中

parent = Parent.get(id) //上面的id parent.child = null

parent.save(flush:true)

// 检查数据库 - 子引用仍然存在 - 预计已被删除

我们将不胜感激任何关于我们做错了什么的建议。使用 grails 1.3.5(最新版本)。

【问题讨论】:

    标签: hibernate grails groovy associations grails-orm


    【解决方案1】:

    从文档开始。

    您需要使用您的级联设置。

    看看

    http://www.grails.org/doc/1.0.x/guide/5.%20Object%20Relational%20Mapping%20(GORM).html

    第 5.5.2.9 节

    【讨论】:

      【解决方案2】:

      首先,您应该使用 child.delete(flush:true) 而不是分配 null。只是不合适。 (抱歉之前的错误)

      我建议您阅读 Peter Ledbrook 系列:http://blog.springsource.com/2010/07/02/gorm-gotchas-part-2/。在你的情况下,搜索“删除孩子”

      更新:如果您仍然没有阅读上述文章(特别有用):

      要删除子集,您首先需要将其从父集合中删除,然后将其删除。但它会导致 property not null 异常,因为您使用了 belongsTo 关系。

      解决方案:您可以将其添加到父类中:

      static mapping = {
       childs cascade: "all-delete-orphan"
      }
      

      上述映射将有助于删除所有没有父级的子级。然后就可以使用了

      parent.childs.clear()
      

      【讨论】:

      • 您的解决方案基本上就是我所说的,只是我没有放弃。我指给他看相关文件。授人以鱼,吃一整天,授人以鱼,吃一辈子....
      • 感谢这些 cmets;我无法让它发挥作用,并且现阶段没有进一步的时间预算进行调查。尝试设置级联“all-delete-orphan”和“all,delete-orphan”。还尝试删除每个条目并调用 clear,然后添加新行,但这会保存 staleObject 异常。如果我再次调查,我可能会更多地使用 logSql 来尝试了解 hibernate 是如何工作的并调试它的配置,但这将不得不等待。感谢您提供的答案。
      • @Alex:clear 命令删除其父集合中的所有“子项”,并使用“all-delete-orphan”删除它们。您无需再次调用删除。正如 hvgotcodes 所提到的,要真正理解这是如何工作的,您无法逃避阅读一些文档。
      • 已接受 - 我们发现执行 parentObject.child.clear() 确实会清除关联元素。
      【解决方案3】:
      static mapping = 
      {
         childs cascade: "all"
      }
      

      这很好用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-08
        • 2022-11-23
        相关资源
        最近更新 更多