[英]JPA - lazy load unidirectional OneToMany not working with discriminator
我正在嘗試在Visit和CrewMember之間建立oneToMany關系。 這個CrewMember是“人的類型”,具有一些其他類型(例如,Passenger)不需要的特定屬性->因此繼承
這個oneToMany關系必須被延遲加載,但是當我獲得乘員組成員時,似乎我的加入沒有考慮歧視因素。
參觀課程:
@Entity
@Table(name = "VISIT")
public class Visit {
@OneToMany
@JoinColumn(name = "VISIT_ID")
private List<CrewMember> crewMembers;
}
CrewMember類:
@Entity
@DiscriminatorValue(value = "CREW")
public class CrewMember extends Person {
@Column(name = "CREW_NUMBER")
private Integer number;
}
人類:
@Entity
@Table(name = "PERSON_ON_BOARD")
@DiscriminatorColumn(name = "TYPE_PERSON_ON_BOARD")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class Person {
...
}
我創建了一種方法來查找這些乘員組成員,如下所示:
@Stateless
public class PeopleOnBoardRepositoryBean implements PeopleOnBoardRepository {
@Override
public List<CrewMember> findCrewMembers(long visitId) {
TypedQuery<Visit> query = em().createQuery("SELECT v FROM Visit v JOIN fetch v.crewMembers WHERE v.id = :visitId", Visit.class);
query.setParameter("visitId", visitId);
Visit visit = query.getSingleResult();
return visit.getCrewMembers();
}
}
但是結果總是包含所有人員(crewMembers,乘客),而不是只有crewMembers ..為什么會這樣,我在做什么錯呢?
如果我嘗試按照“我認為應該正常工作的正常方式”進行操作,例如:
public List<CrewMember> findCrewMembers(long visitId) {
TypedQuery<Visit> query = em().createQuery("SELECT v FROM Visit v WHERE v.id = :visitId", Visit.class);
query.setParameter("visitId", visitId);
Visit visit = query.getSingleResult();
return visit.getCrewMembers();
}
然后我得到:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: be.fgov.health.msw.domain.visit.Visit.crewMembers, no session or session was closed
編輯 :
添加后:
Visit visit = query.getSingleResult();
visit.getCrewMembers.size();
return visit.getCrewMembers();
我已經修復了LazyInitializationException。 這是獲取所有乘員組成員所必需的。 否則,我只是傳遞了一個指向沒有預取元素的arrayList指針,因此出現了LazyInitializationException異常。
鑒別器的問題仍然存在。.我得到了所有人員,而不僅僅是乘員組成員。 我也嘗試添加:
@ForceDiscriminator
在我的Person類上,但這沒有任何改變。 我已經在http://www.gmarwaha.com/blog/2009/08/26/hibernate-why-should-i-force-discriminator/上閱讀了
編輯2:
我通過添加以下內容來“固定”(解決方法)區分符列:
@OneToMany
@JoinColumn(name = "VISIT_ID")
@Where(clause="TYPE_PERSON_ON_BOARD = 'CREW'")
private List<CrewMember> crewMembers;
@Where解決了這個問題,但我實際上發現它非常丑陋。 還有其他方法嗎?
您需要在事務(會話)的邊界內訪問實體bean,否則結果將被分離,從而導致惰性異常
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.