我试图在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解决了这个问题,但实际上我发现这非常难看。还有其他办法吗?
答案 0 :(得分:0)
您需要在事务(会话)的边界内访问实体bean,否则结果将被解除,导致延迟异常