我有以下(简化)代码:
@Entity
class AImpl implements A {
@ManyToOne(fetch = FetchType.LAZY)
private BImpl b;
}
@Entity
class BImpl implements B {
@OneToOne(optional = true, fetch = FetchType.EAGER, orphanRemoval = true, cascade = CascadeType.ALL)
private CImpl c;
}
@Entity
class CImpl implements C {}
如果A(id = 1)和B(id = 1)之间以及B(id = 1)和C(id = 1)之间存在连接,则该断言在大约20%的运行中失败(em ist是EntityManager的一个实例,有一个正在进行的事务):
AImpl a = em.find(AImpl.class, 1l);
BImpl b = em.find(BImpl.class, 1l);
Assert.assertNotNull(b.getC());
为什么呢? b作为代理返回,但我希望所有热切的关联都已加载,但情况并非总是如此。 当我跳过第一行(加载对象a)时,b不是代理,断言总是正确的。
使用调试器我注意到在20%的情况下,我直接进入BImpl实体的getter,而在其他情况下,JavassitLazyInitializer开始发挥作用。