【发布时间】:2019-04-27 22:35:08
【问题描述】:
我在 JPA-HIbernate 一对一关联的案例中观察到以下情况:
当使用 Lazy fetch 进行一对一关联时 - 它会触发 SELECT 查询
class A {
@OneToOne(fetch = FetchType.LAZY, mappedBy = "a", cascade = { CascadeType.PERSIST, CascadeType.MERGE })
public B getB() {
return B;
}
}
当使用 EAGER fetch 进行一对一关联时 - 它会触发 JOIN 查询
class A {
@OneToOne(fetch = FetchType.EAGER, mappedBy = "a", cascade = { CascadeType.PERSIST, CascadeType.MERGE })
public B getB() {
return B;
}
}
我观察到的情况是 1,也没有什么懒惰的,但是当父实体加载时,SELECT 查询几乎立即被触发。
如果 JPA-Hibernate 中的默认配置或它总是 EAGER 与 SELECT/JOIN 查询,延迟加载真的有效吗?
【问题讨论】:
-
你的代码是? vladmihalcea.com/…
-
什么是“几乎立即”?如果您几乎立即调用该惰性属性的 getter,Hibernate 几乎会立即发送额外的 SELECT。
-
@JB Nizet:我与子表中的主键一对一。示例代码已更新。
-
正如链接文章中解释的那样,除非您使用字节码增强,否则反面不能真正偷懒。 Hibernate需要知道A是否有B关联,并且由于A中没有外键(在B中),所以需要执行一个select来知道b是否应该为null。
标签: hibernate jpa lazy-loading eager-loading