【问题标题】:Can all bidirectional relations be LAZY?所有双向关系都可以是 LAZY 吗?
【发布时间】:2018-11-07 22:13:12
【问题描述】:

我正在使用 Spring 和 JPA(休眠)。

当我从许多网站学习关系(实现它们的方法很少)时,也有关于获取类型的讨论,但我在这里提出的问题从未得到完全回答。

我想知道是否存在双向关系不能偷懒的情况? 单向有时也能不偷懒吗?

例如: 假设在一个Warehouse 中有多个Boxes。鉴于这是多对一关系(如前所述,实现它的方式很少,为了这个例子,假设Warehouse 是拥有方)- 它可以在两端都懒惰(你可以加载Box,懒惰Warehouse ,但加载Warehouse 不会加载它所有的Boxes,只有当你真正得到它们时)?

这样的 sn-p 看起来如何 - 我是否只是用 JPA 的 LAZY 或其他一些可能特定于 Hibernate 的东西来注释两端?

【问题讨论】:

    标签: java hibernate jpa


    【解决方案1】:

    所有关系都可以是惰性的,从 Hibernate 文档中,建议将所有关系都标记为惰性:http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#fetching-strategies

    Hibernate 的建议是将所有关联静态标记为惰性,并使用动态获取策略来实现渴望。不幸的是,这与 JPA 规范不一致,该规范定义了所有一对一和多对一的关联都应该在默认情况下急切地获取。 Hibernate,作为一个 JPA 提供者,尊重这个默认值。

    您只需将关系的双方都标记为懒惰:

    @OneToMany(mappedBy = "...", fetch = FetchType.LAZY)
    @OneToOne(fetch = FetchType.LAZY)
    @ManyToOne(fetch = FetchType.LAZY)
    

    映射的默认值(如果您未指定 fetch)是:

    OneToMany: LAZY
    ManyToOne: EAGER
    ManyToMany: LAZY
    OneToOne: EAGER
    

    【讨论】:

      猜你喜欢
      • 2014-01-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 1970-01-01
      • 2011-06-04
      • 1970-01-01
      • 2023-01-20
      • 2019-03-04
      相关资源
      最近更新 更多