2010-04-01 115 views
0

我在一个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(); 

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

感谢

回答

4

一种简单的方法来实现这种类型的事情是方便的方法添加到您的模型类,以确保双向链路的两个方向都设置

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); 
    } 

这需要一些纪律/记住你使用这些方法而不是直接设置/添加;但最好将常用代码放在一个地方。

+0

非常同意这个评论 - 封装这些操作。 – John 2010-04-01 23:35:37

+0

+1;我们也是这样做的。 – mindas 2010-04-02 14:51:01