與JPA

2013-07-10 81 views
30

在Hibernate中EAGER型多取我有一個包含一個實體:與JPA

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "assessment") 
@OrderBy(value = "order ASC") 
private List<AssessmentPart> assessmentParts = new LinkedList<>(); 

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "assessment") 
private List<AssessmentText> texts = new LinkedList<>(); 

,你看到有哪些需要即時加載兩個集合。這不起作用,休眠引發異常:

Caused by: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags 

這是因爲Hibernate無法一次獲取多個集合。但是,如果我將List更改爲SetLinkedList更改爲HashSet此部分工作正常,但另一個 - 更惱人的問題發生。

當我試圖使用從數據庫中獲取的實體:

entityManager.find(entityClass, primaryKey); 

它失敗:

org.hibernate.AssertionFailure: null identifier 

我相信,ID我傳遞給find方法不爲空,我已經調試過,我確信這一點。它不知何故在Hibernate中消失。

如果我將集合類型更改爲LAZY所有內容都可以正常工作,但在某些情況下,我需要使用EAGER

有沒有人有解決方案如何解決它?要麼我可以有一套,但防止發生斷言錯誤,或者我可以有一個列表,但不知何故避免多個提取袋錯誤。

我使用:

Hibernate 4.2.2.Final 
Tomcat 7 
JPA 2.0 
JDK 1.7 

編輯

我剛剛發現加入@Fetch(FetchMode.SELECT)修復的問題,我可以使用多個列表與EAGER類型,但反正是有解決這個問題通過不使用Hibernate特定的註釋?爲什麼它首先解決了這個問題?

+1

有一個答案,確切地說......你應該接受他的答案......只是說。 –

回答

53

問題的根本原因在於,當Hibernate提取SQL查詢結果時,沒有簡單的方法可以判斷哪個子元素屬於哪個集合。舉例來說,請參閱this blog entry以獲得更詳細的解釋。總之,你有以下解決方法:每個集合分別使用子查詢列表@Fetch(FetchMode.SELECT)

  • 部隊使用,而不是包加入索引列@IndexColumn(name="LIST_INDEX")
  • 使用無序集合像集

    • 負載。
  • +7

    正如Hibernate文檔所說(http://docs.jboss.org/hibernate/stable/orm/javadocs/org/hibernate/annotations/IndexColumn.html),@ IndexColumn已棄用。我會推薦使用JPA的@ OrderColumn(http://docs.oracle.com/javaee/7/api/javax/persistence/OrderColumn.html)。 – russellhoff

    12

    如果你正在使用Hibernate和你不小心使用Hibernate註釋:

    與註釋您的收藏領域:

    記得從@OneToMany批註刪除fetchType屬性。

    +2

    這是一個hibernate特定的註釋 – Namphibian