对于关联,Hibernate代理有时返回null

时间:2016-12-06 17:26:24

标签: hibernate jpa eager-loading

我有以下(简化)代码:

@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开始发挥作用。

0 个答案:

没有答案