小编典典

何时在休眠状态下使用延迟加载/急切加载?

hibernate

我相信只有两种使用Hibernate加载对象的方法,即延迟加载和一种渴望加载。延迟加载有其自身的优势,它不会加载很多对象,而只是在需要时才加载它们。我还了解到,如果您想强制为一个对象加载所有子代,则只需调用即可parent.getChildren().size()。假设我们有以下对象

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

@Entity
public class Order{
}

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

我试图了解在哪里使用延迟加载以及在哪里使用渴望加载,非常感谢您的见解。


阅读 281

收藏
2020-06-20

共1个答案

小编典典

我试图了解在哪里使用延迟加载以及在哪里使用渴望加载,非常感谢您的见解。

这里有一些想法:

1)如果您将始终使用某些东西(可以肯定),则可以急于加载它。
2)与1相关,如果您几乎永远不会使用某些东西,请延迟加载它。
3)当涉及大量集合时,延迟加载往往会更有用。
4)过度加载将减少与会话相关的错误,但可能会降低性能。
5)对于复杂的数据模型和/或大型数据库,您将了解应用程序在负载情况下的性能,并调整策略。
6)第一次很难做到这一点。做正确的事,必要时不要害怕改变。
7)对于大型数据集,无论如何,您最终可能都会编写自定义hql /查询,因为默认映射可能会被覆盖,因此懒惰与渴望之间关系不大。

如果您相信#6,那么别为计划太远而烦恼,并在必要时进行更改。

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

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

有了这两个查询之后,在我的服务层中,我就拥有了根据情况来做正确的事情所需的工具。

2020-06-20