何时在休眠中使用延迟加载/急切加载?

Posted

技术标签:

【中文标题】何时在休眠中使用延迟加载/急切加载?【英文标题】:when to use Lazy loading / Eager loading in hibernate? 【发布时间】:2012-09-16 04:06:03 【问题描述】:

我相信使用 Hibernate 加载对象只有两种方法,一种是延迟加载,一种是急切加载。延迟加载有其自身的优势,它不会加载大量对象,而是仅在需要时加载。我还了解到,如果你想强制加载一个对象的所有子对象,你可以简单地调用parent.getChildren().size()。所以假设我们有以下对象

@Entity
public class Customer
public Set<Order> order;


@Entity
public class Order

假设我们有客户在我们的系统中有订单,并且订单可能不止一个,甚至为空。所以我的问题是在这种情况下总是使用急切加载不是更好吗?我们需要与客户相关的订单的尺寸或一些信息。在这种情况下使用延迟加载有什么好处,有什么好处吗?

我正在尝试了解在哪里使用延迟加载以及在哪里使用急切加载,非常感谢您的洞察力。

【问题讨论】:

【参考方案1】:

我正在尝试了解在哪里使用延迟加载以及在哪里使用 急于加载,非常感谢您的洞察力。

以下是一些想法:

1) 如果您总是要使用某些东西(当然),您可以预先加载它。 2) 与 1 相关,如果您几乎从不使用某些东西,请延迟加载它。 3) 当涉及到大型集合时,延迟加载往往更有用。 4) 急切加载内容将减少与会话相关的错误,但可能会降低性能。 5) 对于复杂的数据模型和/或大型数据库,您将了解您的应用在负载下的表现并调整您的策略。 6) 第一次很难做到。做正确的事,如有必要,不要害怕改变。 7) 对于大型数据集,您可能最终还是要编写自定义 hql/查询,其中默认映射可以被覆盖,因此懒惰与渴望无关紧要。

如果您相信第 6 条,那么就不要因为计划太远而陷入困境,如果需要,请进行更改。

WRT 你的具体例子,我可能会写一堆查询来访问数据(当然是由适当的业务需求驱动)

1) 一个加载客户的查询,并将订单留在数据库中(因此延迟加载),当我需要获取客户信息时我会调用它 2)在我需要的情况下加载客户和所有订单信息的查询。所以这种情况下我会忽略默认映射。

有了这两个查询,在我的服务层中,我拥有了我需要的工具来根据情况的上下文执行正确的操作。

【讨论】:

我完全同意,编写两个单独的查询比使用延迟/急切加载要好得多。谢谢你说清楚。【参考方案2】:

这个link完美回答了你的问题。

LAZY加载用于相关实体大小很大并且不需要每次都获取的情况

EAGER 应该与适当的分析一起使用,因为它会在每次加载主实体时加载关系。

因此,如果关系对于业务逻辑计算是绝对必要的,您应该考虑使用 EAGER 加载;延迟加载将适用于大多数情况并提供较少的性能问题。

【讨论】:

以上是关于何时在休眠中使用延迟加载/急切加载?的主要内容,如果未能解决你的问题,请参考以下文章

我可以同时使用急切和延迟加载吗?

实体框架急切加载不返回数据,延迟加载有

远程案例中的延迟/急切加载策略(JPA)

Xamarin Forms Shell - 一次加载每个选项卡 - 急切加载而不是延迟加载

EF急切加载和延迟加载的区别?

异步 SQLalchemy:访问急切加载的空关系会触发新的延迟加载,引发错误