【问题标题】:JPA-Hibernate one to one - Does lazy load really work in this case?JPA-Hibernate 一对一 - 在这种情况下延迟加载真的有效吗?
【发布时间】: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


【解决方案1】:

所以我发现了 JPA 一对一实体的默认行为是什么。 即使 fetch 类型是 LAZY,他们也总是很渴望。没有为其创建代理,并且一对一关联与父提取一起解决。

正如another thread 所建议的,字节码检测是实现惰性解析的正确方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 2017-08-09
    • 2019-04-28
    相关资源
    最近更新 更多