【发布时间】:2015-08-25 13:16:26
【问题描述】:
我有 5 个实体:
@Entity
public class A {
@OneToMany(mappedBy="a", fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
private Set<B1> b1s;
@OneToMany(mappedBy="a", fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
private Set<B2> b2s;
}
@Entity
public class B1 {
@ManyToOne
@JoinColumn(name="c")
private C c;
}
@Entity
public class B2 {
@ManyToOne
@JoinColumn(name="c")
private C c;
}
@Entity
public class C {
@OneToMany(mappedBy="d", fetch=FetchType.EAGER)
@Fetch(FetchMode.JOIN)
private Set<D> ds;
}
@Entity
public classD {
}
总之, 一个渴望加入两组实体 B1 和 B2,每个都渴望加入(隐式)一个实体 C,而后者又渴望加入一组实体 D。
当加载一个 A 对象时,生成的查询看起来像
select (...) from A a0
left outer join B1 b1 on a0.id=b1.aid
left outer join C c1 on b1.cid=c1.id
left outer join D d1 on c1.id=d1.cid
left outer join B2 b2 on a0.id=b2.aid
left outer join C c2 on b2.cid=c2.id
where a0.id=?
问题是与 c2 链接的实体 D 集(通过 B2 实体加载的 C 实体)未在同一个查询中加载,导致每个 c2 对象有 N 个后续查询。
我希望 Hibernate 在第一次查询中为这些对象生成另一个左外连接,就像它在第一次出现 D 时已经这样做了。
我错过了什么?我在 Oracle DB 上使用休眠 3.6,这是一个已知问题吗?
感谢您的宝贵时间。
【问题讨论】: