Hibernate 急切地加载惰性引用
Hibernate eagerly loads lazy reference
我有三个实体 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 的预期行为吗?
OneToOne 延迟加载似乎有问题。 Hibernate 论坛中有 post 解释原因并提供一些建议(https://forum.hibernate.org/viewtopic.php?f=1&t=1001116)。我建议您在询问之前尝试搜索。
我也认为这已经在这里被问到并且得到了很好的答案:试试这个:Making a OneToOne-relation lazy
我有三个实体 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 的预期行为吗?
OneToOne 延迟加载似乎有问题。 Hibernate 论坛中有 post 解释原因并提供一些建议(https://forum.hibernate.org/viewtopic.php?f=1&t=1001116)。我建议您在询问之前尝试搜索。 我也认为这已经在这里被问到并且得到了很好的答案:试试这个:Making a OneToOne-relation lazy