【问题标题】:Trade offs between FetchType.LAZY and FetchType.EAGER?FetchType.LAZY 和 FetchType.EAGER 之间的权衡?
【发布时间】:2021-09-05 09:30:39
【问题描述】:

我目前的理解是 FetchType.EAGER 仅在以下情况下是首选的:

  1. 关联的获取策略为@Fetch(FetchMode.JOIN)@Fetch(FetchMode.SUBSELECT),因此Hibernate在加载根实体时会进行批量查询。
  2. 我们希望确保根实体和关联实体在同一个事务中加载,但这也可以通过其他机制强制执行(例如使用@Transactional)。

在其他情况下,FetchType.LAZY 总是有助于减少数据库请求的数量。这是正确的吗?

【问题讨论】:

  • 据我所知,如果您需要再次调用来获取数据,请使用 EAGER。如果您不关心这些数据...使用 LAZY。
  • 当使用二级缓存时,需要考虑的是某些实体通常会在缓存中,因此您无需访问数据库,即使使用连接也是如此。例如,如果你有大约 200 个国家实体,缓存它们并将相应的关联标记为惰性是有意义的。

标签: java hibernate jpa


【解决方案1】:
  1. @Fetch(FetchMode.JOIN)FetchType.LAZY的关系可以在documentation the following中找到:

...FetchMode.JOIN 在通过实体标识符或自然 ID 直接获取实体时很有用。

此外,FetchMode.JOIN 充当FetchType.EAGER 策略。即使我们将关联标记为FetchType.LAZYFetchMode.JOIN 也会急切地加载关联。

  1. 您可以在文档的this section 中找到以下建议:

Hibernate 的建议是将所有关联静态标记为惰性,并使用动态获取策略来实现渴望。

不幸的是,这与 JPA 规范不一致,该规范定义了所有一对一和多对一关联都应在默认情况下急切获取。

Hibernate,作为 JPA 提供者,遵守该默认设置。

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 2020-02-02
    • 2021-09-29
    • 1970-01-01
    • 2018-12-08
    • 2014-11-17
    • 2011-09-06
    • 2015-12-02
    • 2015-10-19
    相关资源
    最近更新 更多