【问题标题】:What is the best practice to save the one to many domain associated objects in grails?在 grails 中保存一对多域关联对象的最佳实践是什么?
【发布时间】:2012-04-27 23:05:52
【问题描述】:

在 grail 中保存一对多域关联对象的最佳实践是什么?让我们考虑一个场景。

如果您有两个类 A 和 B 并且 A 有许多 B 关系并且 B 属于 A ,那么创建/保存/删除 B 域对象的最佳实践是什么。在许多情况下,当正如所创建的那样。

谢谢

【问题讨论】:

    标签: grails


    【解决方案1】:

    创建 As 时无法创建 B 对象。

    我很确定这不是真的。 Grails 使用 Hibernate,而 Hibernate 有传递持久性的概念,基本上就是级联设置。默认情况下,Grails 有一个级联设置save-update,这意味着如果你创建一个新的父级和一个新的子级,并将子级添加到父级,当你保存父级时,应该保存子级。

    没有“最佳实践”。您需要完全理解 hibernate 中的持久化语义,并选择对您有意义的配置。你想让孩子有自己的生命周期吗?您想要级联哪些操作?您是否希望关系是双向的,关系应该走向何方?开发一个好的领域层需要了解这些问题(以及其他类似问题),以及答案相对于您需要的功能的含义。

    【讨论】:

      【解决方案2】:

      我不太确定你到底在问什么,但是如果你问如何实例化和保存 As 和 B,我会这样做:

      class B {
          String name
          static belongsTo=[a:A]
      }
      
      class A {
          static hasMany=[manyBs:B]
      }
      

      然后:

      def a=new A()
      a.addToManyBs(name:'someB')
      a.save()
      

      【讨论】:

        【解决方案3】:

        我们称对象为 Owner 和 Pet。初始化一个没有宠物的所有者对象并继续保存,只是为了证明不必同时创建宠物。

        Owner owner = new Owner(pets: []).save()
        

        现在我们可以给主人添加宠物了。我们可以用一只宠物做到这一点:

        owner.pets.add(new Pet(name: "fido"))
        

        或者我们可以使用宠物的集合:

        def petCollection = [
            new Pet(name: "Pete"),
            new Pet(name: "meow")
        ]
        owner.pets.addAll(petCollection)
        owner.save()
        

        通过保存 Owner 对象,您会看到新创建的 Pet 对象也被持久化了。

        【讨论】:

          【解决方案4】:

          您需要在域的约束部分中为 nullable true。 即静态约束{ 一个可为空的:真 }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-12-02
            • 1970-01-01
            • 1970-01-01
            • 2011-04-11
            • 1970-01-01
            相关资源
            最近更新 更多