2010-04-01 116 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