簡體   English   中英

JPA-延遲加載單向OneToMany無法與鑒別器一起使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM