当前位置: 首页 > 面试题库 >

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

帅雅逸
2023-03-14
问题内容

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

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

@Entity
public class Order{
}

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

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


问题答案:

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

这里有一些想法:

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


如果您相信#6,那么不要试图太远地计划,并在必要时进行更改。

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

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

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



 类似资料:
  • 问题内容: 我相信只有两种使用Hibernate加载对象的方法,即延迟加载和一种渴望加载。延迟加载有其自身的优势,它不会加载很多对象,而只是在需要时才加载它们。我还了解到,如果您想强制为一个对象加载所有子代,则只需调用即可。假设我们有以下对象 假设我们的客户在我们的系统中有订单,并且该订单可能不止一个甚至为空。所以我的问题是,在这种情况下始终使用渴望加载会更好吗?我们需要与客户相关的订单的大小或一

  • 问题内容: 我遇到了一个问题,JPA试图在我不想要的时候延迟加载我的数据。从本质上讲,正在发生的事情是我正在使用Service检索一些数据,并且当我将这些数据解析为JSON时,JSON库正在触发hibernate模式以尝试懒惰地加载数据。有什么办法可以阻止这种情况?我在下面给出一个例子。 是否可以将JPA /hibernate设置为不尝试并延迟加载数据? 更新: 我意识到您可以使用FetchTyp

  • 问题内容: 我有一个Hibernate对象,其属性都被延迟加载。这些属性大多数是其他Hibernate对象或PersistentSets。 现在,我想强制Hibernate只渴望一次加载这些属性。 当然,我可以通过“接触”这些属性中的每一个,但是也许还有另一种方法可以实现我的目标。 问题答案: 该文档将其如下所示: 您可以在HQL中强制执行通常急切的属性获取。 参考文献 Hibernate Cor

  • 本文向大家介绍Hibernate中的延迟加载和渴望加载之间的区别,包括了Hibernate中的延迟加载和渴望加载之间的区别的使用技巧和注意事项,需要的朋友参考一下 Lazy和Eager是ORM中的两种数据加载策略,例如休眠和Eclipse链接。当一个实体类引用其他实体(例如Employee和Phone(员工中的电话))时,我们使用了这些数据加载策略。  延迟加载-仅当我们显式调用getter或si

  • 问题内容: 我遇到了 一个 问题,即 一对一的延迟加载 在hibernate状态下不起作用。我 已经解决了它 ,但仍然 无法 正确 理解 会发生什么。 我的代码( 延迟加载在这里不起作用 ,当我拉人时-地址也被获取): 但是 :如果我添加 OneToOne关系,则延迟加载 效果很好 ! 问题/完整性: 请向我解释注释如何帮助实现延迟加载。 PS 我已经阅读了post1和post2的帖子,并了解了为

  • 问题内容: 我正在使用Spring事务,因此当POJO到DTO转换时,该事务仍然处于活动状态。 我想防止Dozer触发延迟加载,以使隐藏的sql查询永远不会发生:所有获取都必须通过HQL显式完成(以获得对性能的最佳控制)。 这是一个好习惯吗(我在任何地方都找不到它)? 如何安全地做? 我在DTO转换之前尝试了这个: 我不知道事务会发生什么,但是Hibernate会话不会关闭,并且仍然会发生延迟加载