JPA - 懒惰加载单向OneToMany不使用鉴别​​器

时间:2015-05-21 15:38:26

标签: java jpa

我试图在Visit和CrewMember之间建立oneToMany关系。 这个CrewMember是一个"类型的人"并具有一些其他类型不需要的特定属性(例如乘客) - >因此继承

这个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();
  }
}

但结果总是包含所有人(机组成员,乘客),而不仅仅是机组人员。为什么这样做,我做错了什么?

如果我试图这样做,我认为应该正常工作的正常方式&#34;像:

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:

我已修复&#34; (解决方法)通过添加:

的鉴别器列
@OneToMany
@JoinColumn(name = "VISIT_ID")
@Where(clause="TYPE_PERSON_ON_BOARD = 'CREW'")
private List<CrewMember> crewMembers;

@Where解决了这个问题,但实际上我发现这非常难看。还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

您需要在事务(会话)的边界内访问实体bean,否则结果将被解除,导致延迟异常