Lazy和Eager是ORM中的两种数据加载策略,例如休眠和Eclipse链接。当一个实体类引用其他实体(例如Employee和Phone(员工中的电话))时,我们使用了这些数据加载策略。
延迟加载-仅当我们显式调用getter或size方法时,关联数据才会加载。
使用一对多集合时,请使用延迟加载。
当您确定未使用相关实体时,请使用“延迟加载”。
Egare加载-数据加载发生在获取其父级时。
关系不太多时,请使用“渴望加载”。因此,急切加载是减少服务器上进一步查询的一种好习惯。
当您确定要在所有地方使用主要实体时,请使用“急切加载”。
序号 | 键 | 懒 | 急于 |
---|---|---|---|
1 |
提取策略 |
在延迟加载中,仅当我们显式调用getter或size方法时,关联数据才会加载。 |
在热切加载中,数据加载发生在获取其父级时 |
2 |
ORM层中的默认策略 |
默认情况下,ManyToMany和OneToMany关联使用延迟加载策略。 |
默认情况下,ManyToOne和OneToOne关联使用延迟加载策略。 |
3 |
加载配置 |
可以通过使用注释参数启用它: fetch = FetchType.LAZY |
可以通过使用注释参数启用它: fetch = FetchType.EAGER |
4 |
性能 |
初始加载时间比急切加载要短得多 |
加载过多不必要的数据可能会影响性能 |
问题内容: 我有一个Hibernate对象,其属性都被延迟加载。这些属性大多数是其他Hibernate对象或PersistentSets。 现在,我想强制Hibernate只渴望一次加载这些属性。 当然,我可以通过“接触”这些属性中的每一个,但是也许还有另一种方法可以实现我的目标。 问题答案: 该文档将其如下所示: 您可以在HQL中强制执行通常急切的属性获取。 参考文献 Hibernate Cor
问题内容: 我相信只有两种使用Hibernate加载对象的方法,即延迟加载和一种渴望加载。延迟加载有其自身的优势,它不会加载很多对象,而只是在需要时才加载它们。我还了解到,如果您想强制为一个对象加载所有子代,则只需调用即可。假设我们有以下对象 假设我们有一些客户在我们的系统中有订单,并且该订单可能不止一个甚至为空。所以我的问题是,在这种情况下始终使用渴望加载会更好吗?我们需要与客户相关的订单的大小
问题内容: 我正在使用Spring + Hibernate。我所有的HibernateDAO都直接使用sessionFactory。 我有应用程序层->服务层-> DAO层,所有集合都被缓慢加载。 因此,问题在于,有时在应用程序层(包含GUI / swing)中,我会使用服务层方法(包含@Transactional批注)加载实体,并且我想使用此对象的惰性属性,但忽略了会话已经关闭。 解决此问题的最
我知道什么是DTO:一个在进程之间传输数据以减少方法调用数量的对象。我知道什么是hibernate中的延迟加载。 我在《JHipster的全栈开发》一书中读到这样一句话:JHipster在服务器端使用DTO(数据传输对象)和VM(视图模型)。DTO用于将数据从服务层传输到资源层。它们打破了Hibernate事务,避免了资源层触发进一步的延迟加载。 我不明白DTO和延迟加载之间的关系。
问题内容: 我遇到了像大多数尝试使用ORM进行远程处理的人一样的LazyLoading异常。在大多数情况下,切换到渴望获取可解决此问题(延迟加载/非原子查询/线程安全/ n + 1问题…)。但是,如果要处理非常大的对象图,那么急于获取也有缺点。 在大多数用例中,不需要加载整个对象图。加载所需的更多数据(或从db加载它们并提取所需的子集)感觉很糟糕。 那么(在运行时)有什么替代方法可以解决此类问题?
问题内容: 我正在使用Hibernate的延迟加载,并且即使在web.xml中定义了一个使用OpenSessionInViewFilter的过滤器后,也正在获取sessionFactory缺少的异常 我的servlet-context.xml具有以下会话和事务管理器定义: 我仍然收到以下异常: 我尝试定义一个sessionFactoryBeanName属性,但结果没有改变。我究竟做错了什么? 问题