java - 什么时候在 hibernate 中使用延迟加载/急切加载?

标签 java hibernate lazy-loading

我认为使用 Hibernate 加载对象只有两种方法,一种是延迟加载,一种是预加载。延迟加载有它自己的优势,它不是加载很多对象,而是只在你需要的时候加载。我还了解到,如果您想强制加载一个对象的所有子项,您只需调用 parent.getChildren().size()。假设我们有以下对象

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

@Entity
public class Order{
}

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

我正在尝试了解在何处使用延迟加载以及在何处使用预加载,非常感谢您的见解。

最佳答案

I am trying to understand where to use lazy loading and where to use eager loading, highly appreciate your insight.

这里有一些想法:

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

如果您相信第 6 点,那么就不要因为计划得太早而陷入困境,并在必要时进行更改。

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

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

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

关于java - 什么时候在 hibernate 中使用延迟加载/急切加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12569403/

相关文章:

java - 实现 Fragment 到 Activity 的通信而不直接在 Activity 中实现接口(interface)

如果第二个列表的一项满足条件并返回新列表,则 Java 8 foreach 添加到新列表

entity-framework - Entity Framework 4 POCO-延迟+渴望加载

java - 使用 hibernate 4 进行延迟加载初始化

c# - 来自 ASP.NET MVC 后端的 Javascript 客户端延迟加载模型

java - gradle bootRun : application fail to start with classpath

java - 如何使用struts2预填充复选框列表

java - Weblogic11g - java.lang.NoSuchMethodError : javax. persistence.OneToOne.orphanRemoval()z

java - @OneToMany 不获取现有的子项

java - 有时 java.net.SocketTimeoutException : Read timed out. 有时不