gpt4 book ai didi

hibernate - 什么时候应该将 hasMany 用于 N :1 relationships in grails domain classes?

转载 作者:行者123 更新时间:2023-12-04 17:58:46 24 4
gpt4 key购买 nike

在 grails 中,我可以实现这样的 N:1 关系:

class Parent { hasMany = [children:Child] }
class Child { belongsTo = [parent:Parent] }

现在(如果始终正确使用 addTo 和 removeFrom)我可以通过 parent.children 获取父级的子级。

但我也可以在没有 hasMany 的情况下做到这一点:
class Parent { }
class Child { belongsTo = [parent:Parent] }

然后我必须使用 Child.findAllByParent(parent) 来获取所有 child 。

我的问题:如果可以以第二种方式查询 parent 的 child ,我应该使用 hasMany 是否有任何重要原因?

我想有时仅引用 parent.children 会更容易(如果与父级一起急切获取可能会更快?),但另一方面,当有多个子级时,此列表可能会变得相当长。我不喜欢 hasMany 的一点是,您总是必须注意 addTo 或 removeFrom 或在添加带有父级的新子级后清除 session ,以便 grails 自动执行此操作...

如果 child 很少,您应该简单地使用 hasMany 而如果有很多(出于性能原因),则不要使用它,还是背后有更多的答案?

最佳答案

使用hasMany 与belongsTo 与您要在更新/删除发生时指定的级联行为更相关。在您的第二个示例中,级联在子级设置为 ALL,在父级设置为 NONE。如果您删除一个子项,则父项将不会发生任何事情。如果删除父级,所有子级都将自动删除。

在您的第一个示例中,级联在父端设置为 ALL,在子端设置为 SAVE-UPDATE。所以现在您可以执行以下操作:

parent.addToChildren(child1)
parent.addToChildren(child2)
parent.addToChildren(child3)
parent.save(flush:true)

当您保存父项时,所有子项都将被更新。

触及你没有问过的事情,你大概也有这样的事情:
class Parent { hasMany = [children:Child] }
class Child { Parent parent }

如果以这种方式定义了 Child 到 Parent 的关系,则在删除 parent* 时,您将需要手动管理引用该 parent 的 Child 对象。 (*这更正了先前被证明不准确的陈述)

所以,hasMany/belongsTo 有两个主要考虑:
  • 你想在更新/删除时执行什么样的级联策略
  • 您最有可能如何访问数据,如果您希望需要为父级检索一组子级,则使用 parent.getChildren() 方法非常方便。

  • 更新:

    我还想澄清一下,当您使用 hasMany 时,GORM 不会立即获取;默认情况下,GORM 使用延迟获取策略,因此在尝试访问 parent.children 之前它不会获取 child

    如果您希望默认情况下急切地获取关联,您可以指定适当的映射:
    class Parent { 
    hasMany = [children:Child]
    static mapping = {
    children lazy:false
    }
    }

    最后,你提到你不喜欢你必须担心 hasMany 端的 addTo/removeFrom 。如果使用flush:true 保存,则不必执行此操作。
    def parent = Parent.get(id)
    def child = new Child(name:'child1', parent:parent)
    if(child.save(flush:true)) {
    // both sides of the relationship should be good now
    }

    编辑:修复了子级/父级级联默认值的颠倒顺序,并纠正了关于 gorm 如何在没有belongsTo 的情况下处理关系的误解

    关于hibernate - 什么时候应该将 hasMany 用于 N :1 relationships in grails domain classes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3141941/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com