2011-09-28 40 views
0

我平時父母 - 子女關係一對多:JPA2和hibernate - 爲什麼合併存儲子實體而堅持不存在?

@OneToMany(mappedBy = "mapType", cascade = CascadeType.ALL, orphanRemoval = true) 
public List<Child> getChildren() { 
    return children; 
} 

我有相當標準的使用情況:

  • 必須刪除persist-這工作正常的孩子。

  • 添加新的兒童通過添加到收藏。這對於已經堅持的父母來說工作得很好,但對於新父母來說不起作用。 EntityManager.merge然而確實堅持與新的孩子的新父母。

爲什麼添加新的孩子不適用於新的父對象?他們肯定是在堅持被調用之前。

順便說一句,我在Hibernate 3.6.6上。

+2

http://stackoverflow.com/questions/4509086/what-is-the-difference-between-persist-and-merge-in-hibernate/4509389#4509389 – NimChimpsky

+0

是的,我已閱讀並理解語義。如果你閱讀我的問題,你會看到我得到不同的行爲持久的子實體,取決於父對象是否是新的。這不是由你的鏈接,或我已閱讀的許多其他文章解釋。 – Will

+0

似乎如果堅持被稱爲_before_設置子實體,級聯工作。 OTOH,如果堅持被稱爲_after_設置子實體,級聯不會發生。這是預期的行爲? – Will

回答

0

嘗試在@OneToMany註釋fetch = FetchType.EAGER中添加此屬性。默認值是LAZY。這將是有益的,因爲休眠將永久性地管理集合,然後您進行更改。

+0

不幸的是,這並沒有幫助,因爲問題是與新的實體,而不是由休眠提取的問題。另外我在一個實體上有兩個子實體列表,而hibernate不支持在實體上急切加載多個行包! – Will

+0

那種方式你選擇說什麼冬眠集合中的哪個項目的任何地方? – Yappie

+0

設置實體註釋中的EAGER提取在80%的情況下是有害的。導致使用'find()'時不能被覆蓋的不需要的提取,也不在HQL/JPAQL中。也可能導致交叉讀取,最終加載整個2個表格。 –

相關問題