Java Hibernate急切地加载惰性引用

Java Hibernate急切地加载惰性引用,java,hibernate,memory-leaks,lazy-loading,eager-loading,Java,Hibernate,Memory Leaks,Lazy Loading,Eager Loading,我有三个实体A、B和C @Entity public class A { @Id private long id; @OneToOne(fetch = FetchType.EAGER) @JoinColumn(name = "ID", insertable = false, updatable = false) public B b; } @Entity public class B { @Id private long id; @OneToOne(fetc

我有三个实体A、B和C

@Entity
public class A {
  @Id
  private long id;

  @OneToOne(fetch = FetchType.EAGER)
  @JoinColumn(name = "ID", insertable = false, updatable = false)
  public B b;
}

@Entity
public class B {
  @Id
  private long id;

  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "ID", insertable = false, updatable = false)
  public C c;
}

@Entity
public class C {
  @Id
  private long id;

  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "ID", insertable = false, updatable = false)
  public B b;
}
因此,在A中有一个急切加载的B引用,B和C之间是一个缓慢加载的双向关系

我的问题是:当从DB中获取A的实例时,Hibernate也会获取C的实例

由于内存泄漏,我在堆转储中发现了它,并以编程方式对其进行了测试:

@Test
public void eagerAndLazyLoading() {
  A a = dao.getA(1L);

  Assert.assertNotNull(a);

  PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();

  Assert.assertTrue(puu.isLoaded(a));
  Assert.assertTrue(puu.isLoaded(a, "b"));
  Assert.assertFalse(puu.isLoaded(a.b, "c"));
}
最后一个断言失败了

幸运的是,摆脱双向关系没有问题,但我想知道问题的根源。
Hibernate的预期行为是急切地加载一个实体的所有引用吗?

似乎OneOne延迟加载存在一些问题。Hibernate论坛上有帖子解释了原因并给出了一些建议()。我建议在你问之前先搜索一下。
另外,我认为这里已经有人问了这个问题,并且得到了非常好的答案:试试这个:

谢谢你的回答。显然,我自己找不到它,因为我认为它只对渴望加载的实体重要,而不是对每一个一对一的关系。