2011-06-12 23 views
0

我有以下類別:如何更新hibernate上的集合?

class A { 
    Integer id; 

    @OneToMany(mappedBy="parent", fetch=FetchType.EAGER, cascade={CascadeType.ALL}) 
    Set<B> children; 
} 

class B { 
    Integer id; 

    @ManyToOne(fetch=FetchType.EAGER) 
    A parent; 
} 

在數據庫中有數據,說有{B1,B2,B3}兒童A1。 當我嘗試更新a1的孩子集{b4,b5}我最終在數據庫中有b1..b5。 在我的代碼中,我採取了預防措施,在子集上調用clear(),但它不影響數據庫。

我應該迭代和呼籲session.delete(child) A的每個孩子?

謝謝,

回答

2

從Java EE 6(和Hibernate 3.5),你應該使用@OneToMany(...,orphanRemoval=true)

此前的Java EE 6/Hibernate的3.5,你可以使用org.hibernate.annotations.CascadeType.DELETE_ORPHAN,這是有利於增加的棄用3.5對JPA的孤兒刪除。

+0

我正在使用hibernate 3.6.4,並且DELETE_ORPHAN顯示爲棄用。 – Dan 2011-06-13 17:55:09

+0

感謝您指出。 Javadocs表示已棄用棄用版本。使用@OneToOne(orphanRemoval = true)或@OneToMany(orphanRemoval = true)。我要更新答案以明確說明。 – 2011-06-13 17:59:29

0

問題是Cascade.All關於子項目。基本的問題是,即使你正在清除父對象上的集合,子對象將自己保存爲擁有a1作爲父對象。這意味着你需要清除雙方的關係。有兩條路線:

  1. 刪除子項上的cascade.all,並讓父對象管理整個關係。

  2. 通過清除子元素上的父元素或完全刪除它們從會話中手動處理關係。在選擇這條路線時,您需要非常明確地瞭解集合中每個元素的情況。

+0

試圖從兒童方面刪除級聯,仍然同樣的效果。以前的小孩不會被刪除。任何想法爲什麼? – Dan 2011-06-13 05:17:26

+0

您是否嘗試在從一側刪除級聯之後進行清除()?如果這不起作用,那麼最好的辦法就是嘗試第2條線路--Hibernate對於如何管理好多關係非常嚴格。 – Fourth 2011-06-13 11:27:04