7

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

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

@Entity
public class Order{
}

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

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

4

2 回答 2

20

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

这里有一些想法:

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

如果你相信#6,那么不要被困在试图计划太远的时候,如果你不得不改变它。

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

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

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

于 2012-09-24T16:56:55.510 回答
5

这个链接完美地回答了你的问题。

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

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

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

于 2012-09-24T16:55:45.160 回答