在使用Hibernate时,经常会遇到实体对象延迟加载问题。
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。下面我们就分别介绍这些种类的延迟加载的细节。
Hibernate实现实体对象延迟加载:
如果想Hibernate实现实体对象延迟加载,必须要在实体的映射配置文件中进行相应的配置,如下所示:
1 |
< hibernate-mapping >
|
2 |
< class name=”com.neusoft.entity.User” table=”user” lazy=”true”>
|
3 |
…… |
4 |
</ class >
|
5 |
</ hibernate-mapping >
|
通过将class的lazy属性设置为true,来开启实体的延迟加载特性。如果我们运行下面的代码:
1 |
User user=(User)session.load(User. class ,” 1 ”);
|
2 |
System.out.println(user.getName()); |
当运行到第一条时,Hibernate并没有发起对数据的查询,如果我们此时通过一些调试工具(比如JBuilder2005的Debug工具),观察此时user对象的内存快照,我们会惊奇的发现,此时返回的可能是 User$EnhancerByCGLIB$$bede8986类型的对象,而且其属性为null,这是怎么回事?session.load()方法,会返回实体对象的代理类对象,这里所返回的对象类型就是User对象的代理类对象。在Hibernate中通过使用CGLIB,来实现动态构造一个目标对象的代理类对象,并且在代理类对象中包含目标对象的所有属性和方法,而且所有属性均被赋值为null。通过调试器显示的内存快照,我们可以看出此时真正的User对象,是包含在代理对象的CGLIB$CALBACK_0.target属性中,当代码运行到第二条时,此时调用user.getName()方法,这时通过CGLIB赋予的回调机制,实际上调用 CGLIB$CALBACK_0.getName()方法,当调用该方法时,Hibernate会首先检查CGLIB$CALBACK_0.target属性是否为null,如果不为空,则调用目标对象的getName方法,如果为空,则会发起数据库查询,生成类似这样的SQL语句:select * from user where id='@id';来查询数据,并构造目标对象,并且将它赋值到 CGLIB$CALBACK_0.target属性中。
这样,通过一个中间代理对象,Hibernate实现实体对象延迟加载,只有当用户真正发起获得实体对象属性的动作时,才真正会发起数据库查询操作。所以实体的延迟加载是用通过中间代理类完成的,所以只有session.load()方法才会利用实体延迟加载,因为只有session.load()方法才会返回实体类的代理类对象。
相关推荐
在单页应用中,如果没有应用懒加载,运用webpack打包后的文件将会异常的大,造成进入首页时,需要加载的内容过多,延时过长,不利于用户体验,而运用懒加载则可以将页面进行划分,需要的时候加载页面,可以有效的...
不建议用Hibernate,它的insert效率实在不搞,不过最新版本的Hibernate似乎已经在批量处理的时候做过优化了,设置一些参数如batch_size,不过性能我没有测试过
浅析frmware的加载和init通过netlink处理uevent事件的一般流程
马晓槟-浅析分散加载,对单片机开发进阶很有帮助,分散加载变量、函数和代码。更好地理解编译原理和链接。
Vue是可以自定义指令的,最近学习过程中遇见了一个需要懒加载的功能,发现网上这方面的资料较少,所以下面这篇文章主要给大家介绍了关于Vue.js如何实现路由懒加载的相关资料,需要的朋友可以参考借鉴,下面来一起看看...
论坛系统hibernate jsp hibernate 毕业论文项目
主要介绍了Java的Hibernate框架中的缓存和延迟加载机制,Hibernate是注明的Java下SSH三大web开发框架之一,需要的朋友可以参考下
H5 缓存机制浅析 - 移动端 Web 加载性能优化
动态插入节点是最为简单也最为广泛的一种异步加载方式,然后使用动态插入节点方法加载的文件都会 在加载后立即执行,javascript的执行一方面会占用浏览器js执行进程,另一方面也可能改变页面结构,而css 的执行更有...
本文档介绍了spring中的在classpath中加载配置文件
调用方法 出现加载条 2.怎么实现进度条呢? 1) 在document.body 新增一个div.覆盖浏览器. 设置背景会灰色. z-index = 999. 加载的时候让用户无法修改界面值 2) 在document.body 新增一个动态的div. 代码实现: ...
主要介绍了Mybatis与Hibernate的区别与用途的相关资料,需要的朋友可以参考下
工业软件浅析doc,工业软件浅析
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结.docx
浅析网络安全技术.pdf浅析网络安全技术.pdf浅析网络安全技术.pdf
NULL 博文链接:https://278672937.iteye.com/blog/2146869