什么时候在hibernate中使用Lazy loading / Eager加载?

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

 @Entity public class Customer{ public Set order; } @Entity public class Order{ } 

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

我试图了解在哪里使用延迟加载以及在哪里使用预先加载,非常感谢您的洞察力。

我试图了解在哪里使用延迟加载以及在哪里使用预先加载,非常感谢您的洞察力。

以下是一些想法:

1)如果你要总是使用某些东西(肯定),你可以急于加载它。
2)与1相关,如果你几乎永远不会使用某些东西,懒加载它。
3)当涉及大型集合时,延迟加载往往更有用。
4)急切地加载东西会减少与会话相关的错误,而且可能会降低性能。
5)对于复杂的数据模型和/或大型数据库,您将看到您的应用程序在加载调整策略时的工作方式。
6)第一次很难做到正确。 做正确的事情,如果有必要,不要害怕改变。
7)对于大型数据集,你可能最终会编写自定义的hql /查询,其中默认映射可以被覆盖,所以lazy vs eager并不重要。

如果你相信#6,那么不要试图计划太远,并在必要时改变它。

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

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

有了这两个查询,在我的服务层中,我有基于情境的上下文所需的工具。

此链接完美地回答了您的问题。

LAZY加载用于相关实体大小很大的情况下,另一方面不需要每次都获取LAZY加载

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

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