”一天一节“之Hibernate的延迟加载--实体对象的延迟加载
实体对象的延迟加载是让实体对象在加载的时候,比如session.load()的时候并不立即进行数据加载,而是当我们调用这个实体对象的某个属性方法时,比如xx.getName()时才去进行数据加载工作,这样只有真正用到的地方才去加载,一定程度上减小了性能的开销。这里我们对性能不做深入的探究,我只要说下hibernate的实体对象实现延迟加载的原理。我们来看下面的两个例子,分别是开启和关闭实体对象的延迟加载操作,方面很简单只需要在相应的实体对象映射文件中的class节点设置lazy=”true”和lazy=”false”:
示例代码:
Goods goods = ( Goods )session.load(); ①
goods.getName(); ②
当lazy=”false”时,调试以上程序可以看到
很显然goods对象的数据立马就被加载出来了。
当lazy=”true”时,调试以上程序可以看到
看到了吗,产生的结果完全不一样了,不再是直接加载出一个goods对象了,代替它的是Goods$$EnhancerByCGLIB$$e12dcc71(id=26),这个到底是什么,我们来大胆猜想下,我们看到里面有一个CGLIB,会不会是一个代理对象,对的,这个就是在运行期间针对Goods对象所产生的一个代理对象,这个对象具有Goods的所有属性,另外,它还有它自己的一些属性,比如上面我们看到的target属性,而这个属性的类型恰恰就是Goods。由此我们看到hibernate的实体对象延迟加载的实现原理重点就是这个代理对象,通过在运行期产生一个代理来达到延迟的效果。这里有必要说明下当上面程序执行到①时,它实际上并没有去加载数据,而是去构造了一个像上图一样的代理对象,并且这个代理对象拥有了加载对象的所有属性;当程序执行到②时,我们调用的goods.getName()实际上执行的是这个代理对象的proxyObj.getName(),它会先从target对象中的getName()中寻找,如果有对象则直接返回,如果没有则进行数据加载工作,并将加载出来的数据填充到target对象中。
以上就是实体对象实现延迟加载的一个基本原理,其核心就在于CGLIB,在运行期构建一个代理对象以达到延迟加载的效果。
分享到:
相关推荐
此外,`hibernate-mapping-3.0.dtd`还支持更复杂的映射,如一对一、一对多、多对多的关系映射,以及自定义类型、延迟加载等特性。 在实际应用中,`hibernate.properties`文件是Hibernate 5.0.7版本的配置文件,主要...
- `lazy="proxy"`:表示Hibernate将为`Dept`实体创建一个代理对象,只有当真正访问到`Dept`对象的相关属性时,Hibernate才会发起数据库查询,加载实际的`Dept`对象。 - `fetch="select"`:默认值,表示在查询`Emp`时...
8. **延迟加载**:Hibernate的懒加载策略可以在需要时才加载关联对象,提高系统性能。 9. **事件监听器**:允许自定义事件监听器来扩展Hibernate的功能,如在对象保存或更新时触发某些操作。 10. **类型转换**:...
集合属性的延迟加载是延迟加载中最常见的应用场景之一。当一个实体拥有大量的关联对象时,如果在初始化实体时也同时初始化这些关联对象,将会导致性能瓶颈。因此,延迟加载提供了一种解决方案:只在真正需要时加载...
- **延迟加载**: JPA的懒加载机制使得关联的对象只有在真正需要时才从数据库加载,提高性能。 **3. Hibernate JPA 2.1 API的使用** - **配置**: 开发者需要在pom.xml或build.gradle文件中添加`hibernate-jpa-2.1-...
要在Hibernate中启用实体对象的延迟加载,需要在映射文件中为相应的类添加`lazy="true"`属性,例如: ```xml ... ``` **工作原理:** 当执行如下代码时: ```java User user = (User) session.load(User....
Hibernate,作为Java领域最著名的对象关系映射(ORM)框架之一,自诞生以来就深受开发者喜爱。本次我们聚焦于`hibernate-release-4.3.10.Final`版本,这是一个稳定且功能丰富的版本,为开发者提供了强大的数据持久化...
在实际运行中,当我们通过`session.get(Person.class, 1)`获取一个`Person`对象时,如果没有明确地访问`addresses`,Hibernate只会加载`Person`的基本信息,而不会加载与之关联的`Address`集合。在调试模式下,我们...
hibernate-jpa-2.0-api-1.0.1.Final.jar
总的来说,"hibernate-cglib-repack-2.1_3.jar"是Hibernate框架中不可或缺的一部分,它通过CGLIB库实现了对Java类的动态代理,提供了诸如懒加载、拦截器等高级功能,极大地增强了ORM的灵活性和可扩展性。在实际开发...
Hibernate的懒加载机制可以在需要时才加载关联的对象,避免了大量数据一次性加载导致的内存压力。但需注意防止“懒加载地狱”。 九、性能优化 包括但不限于:合理使用缓存,避免N+1查询问题,使用批处理更新,选择...
详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助
8. **延迟加载**:Hibernate的懒加载策略能有效减少数据库交互,只有在真正需要时才加载关联的对象,提高了程序效率。 9. **类型转换**:Hibernate提供了一系列的Type实现,将Java类型和数据库类型之间进行自动转换...
总结来说,Hibernate-CGLIB的结合使用为Java开发带来了便利,通过动态生成的代理对象,实现了对象的懒加载和透明持久化。而“hibernate-cglib-repack-2.1_3.jar.zip”这个压缩包,提供了特定版本的集成库,方便...
Hibernate Annotations是Hibernate 3.x系列引入的新特性,它允许开发者在Java实体类上直接使用注解来定义对象关系映射信息,替代了传统的Hibernate XML配置文件。这种注解方式提高了开发效率,减少了配置文件的维护...
本次我们将深入探讨的版本是`hibernate-release-5.0.0.Final(1)`,这个版本在Hibernate的生命周期中具有重要的地位,它引入了多项新特性和改进,旨在提升开发效率和性能。 一、Hibernate概述 Hibernate是Java领域中...
因为Hibernate在读出hbm.xml文件时需要通过网络读取到hibernate-mapping-3.0.dtd 文件。 如果没有网络不能正常工作。 所以提供上述文件。 以及hibernate-mapping-3.0.dtd,hibernate-configuration-3.0.dtd提供下载...
Hibernate提供延迟加载机制,当对象的关联属性未在查询中明确加载时,只有在真正访问该属性时才会触发数据库查询。而立即加载则会在加载主对象时同时加载关联对象,这需要根据实际场景选择合适策略。 九、性能优化 ...