【问题标题】:Hibernate and parent/child relationsHibernate 和父/子关系
【发布时间】:2010-04-01 20:24:36
【问题描述】:

我在 Java 应用程序中使用 Hibernate,我觉得在管理父/子关系方面可以做得更好。

我有一组复杂的实体,它们之间有某种关系(一对多、多对多、一对一、单向和双向)。 每次保存实体并且它具有父级时,为了建立父级必须将子级添加到其集合中的关系(考虑一对五的关系)。 例如:

Parent p = (Parent) session.load(Parent.class, pid);
Child c = new Child();
c.setParent(p);
p.getChildren().add(c);
session.save(c);
session.flush();

以同样的方式,如果我删除一个孩子,那么我也必须从父集合中显式删除它。

Child c = (Child) session.load(Child.class, cid);
session.delete(c);
Parent p = (Parent) session.load(Parent.class, pid);
p.getChildren().remove(c);
session.flush();

我想知道是否有一些最佳实践可以以不同的方式完成这项工作:当我保存子实体时,会自动将其添加到父集合中。如果我删除一个孩子,通过删除孩子等自动更新父集合。

例如,

Child c = new Child();
c.setParent(p);
session.save(c); // Automatically update the parent collection
session.flush();

Child c = (Child) session.load(Child.class, cid);
session.delete(c); // Automatically updates its parents (could be more than one)
session.flush();

无论如何,实现这种行为并不难,但我想知道是否存在一些标准工具或众所周知的库来处理这个问题。如果不是,原因是什么?

谢谢

【问题讨论】:

    标签: java hibernate entity-relationship


    【解决方案1】:

    实现此类事情的一种简单方法是在模型类中添加便利方法,以确保设置双向链接的两个方向

    public class Parent {
        ...
        public void addChild(Child child) {
            this.getChildren.add(child);
            child.setParent(this);
        }
    
        public void removeChild(Child child) {
            this.getChildren.remove(child);
            child.setParent(null);
        }
    

    这需要您有一定的纪律/记忆才能使用这些方法而不是直接设置/添加;但最好将常用代码放在一个地方。

    【讨论】:

    • 非常同意这个评论——封装那些操作。
    猜你喜欢
    • 2013-05-26
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 2011-02-05
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多