2011-12-06 81 views
3

我有一個與B類具有一對多關係的類A & C.我已經將fetchType設置爲EAGER,這導致了JPA中的多包提取問題。現在有兩種方法可以解決我所知道的問題。要麼我保持提取類型Eager &將它們從List更改爲Set,這對我來說是OK的,或者將fetchType更改爲「lazy」,並使用join查詢來EAGER獲取關係。什麼是推薦的方法?使用fetch join或EAGER解決休眠多包提取問題?

回答

1

我寧願去取集合(雖然單個提取的限制存在於查詢中,但如果你使用休眠),因爲變化是你有時希望列出所有A對象而不想要B & C.個人I大多數情況下使用列表,因爲我想直接將集合顯示到jsf數據表(不能處理集合),並且我不得不通過在後端手動讀取集合來初始化集合,而不是在集合不止一個集合時讀取集合。

3

「多袋JPA獲取問題」

指出,他們沒有「多袋JPA獲取問題」,這是與Hibernate的特定問題。其他JPA提供者沒有這個問題,並且JPA完全允許你有多個EAGER OneToMany關係。

+0

其他供應商沒有這種袋子的概念,所以這是一個稻草人的論點。 –

1

在渴望集合獲取時,默認情況下,Hibernate「交叉連接」根和集合表。這可能會導致重複的根元素被返回,這可能不需要。三種可能的解決方案:

  1. 不急於獲取;
  2. 使用FetchMode.SELECT強制執行選擇獲取(仍然渴望但沒有聯合提取);或
  3. 將結果散列到Set中。建議設置方法,前提是您絕對需要始終附加說明集。即使使用額外的散列步驟,聯合提取的性能也要優於選擇提取,這實際上毫無成本。
0

考慮將集合映射爲列表而不是包。這是通過只添加@org.hibernate.annotations.IndexColumn或自JPA 2.0開始,更喜歡@javax.persistence.OrderColumn