Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate代理有时会为关联返回null_Hibernate_Jpa_Eager Loading - Fatal编程技术网

Hibernate代理有时会为关联返回null

Hibernate代理有时会为关联返回null,hibernate,jpa,eager-loading,Hibernate,Jpa,Eager Loading,我有以下(简化)代码: 假设a(id=1)和B(id=1)之间以及B(id=1)和C(id=1)之间存在连接,则此断言在大约20%的运行中失败(em是EntityManager的实例,存在正在进行的事务): 为什么??b作为代理返回,但我希望所有的急切关联都已加载,但情况并非总是如此。 当我跳过第一行(加载对象a)时,b不是代理,断言总是正确的 使用调试器,我注意到在20%的情况下,我直接进入BImpl实体的getter,在其他情况下,JavassitLazInitializer起作用 除非涉及

我有以下(简化)代码:

假设a(id=1)和B(id=1)之间以及B(id=1)和C(id=1)之间存在连接,则此断言在大约20%的运行中失败(em是EntityManager的实例,存在正在进行的事务):

为什么??b作为代理返回,但我希望所有的急切关联都已加载,但情况并非总是如此。 当我跳过第一行(加载对象a)时,b不是代理,断言总是正确的


使用调试器,我注意到在20%的情况下,我直接进入BImpl实体的getter,在其他情况下,JavassitLazInitializer起作用

除非涉及并发性,否则代码在20%的情况下是不可能失败的。Hibernate的行为是非常确定的,不依赖于概率。从上面的代码来看,还不清楚问题出在哪里——它没有保存/更新逻辑以及ID生成策略。另外,我要删除接口-它们在这里不相关。@StanislavBashkyrtsev感谢您的评论。有趣的是,如果我使用B引用(不是BImpl)访问属性getC(),我就不会有这个问题。除非涉及并发性,否则代码在20%的情况下是不会失败的。Hibernate的行为是非常确定的,不依赖于概率。从上面的代码来看,还不清楚问题出在哪里——它没有保存/更新逻辑以及ID生成策略。另外,我要删除接口-它们在这里不相关。@StanislavBashkyrtsev感谢您的评论。有趣的是,如果我使用B引用(不是BImpl)访问属性getC(),我就不会有这个问题。
@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 {}
AImpl a = em.find(AImpl.class, 1l);
BImpl b = em.find(BImpl.class, 1l);
Assert.assertNotNull(b.getC());