【问题标题】:Hibernate eagerly loads lazy referenceHibernate 急切地加载惰性引用
【发布时间】:2015-07-30 08:33:45
【问题描述】:

我有三个实体 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 之间是一个延迟加载的双向关系。

我的问题:当从数据库中获取 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 的预期行为是急切加载一个实体的所有引用,即急切加载?

【问题讨论】:

    标签: java hibernate memory-leaks lazy-loading eager-loading


    【解决方案1】:

    OneToOne 延迟加载似乎有一些问题。 Hibernate 论坛中有帖子解释了原因并给出了一些建议(https://forum.hibernate.org/viewtopic.php?f=1&t=1001116)。我建议在您询问之前尝试搜索。 另外我认为这已经在这里被问过并且得到了很好的答案:试试这个:Making a OneToOne-relation lazy

    【讨论】:

    • 感谢您的回答。显然我自己找不到它,因为我认为它只对急切加载的实体很重要,而不是每个 OneToOne-Relationship。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    相关资源
    最近更新 更多