当前位置: 首页 > news >正文

hibernate的lazy机制

 

转自: http://blog.csdn.net/jojoy_828/archive/2007/12/01/1911325.aspx 
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。如果想对实体对象使用延迟加载,必须要在实体的映射配置文件中进行相应的配置,如下所示:
 
<hibernate-mapping>
 <class name=”com.neusoft.entity.User” table=”user” lazy=”true”>
   ……
 </class>
</hibernate-mapping>
 
通过将class的lazy属性设置为true,来开启实体的延迟加载特性。如果我们运行下面的代码:
 
User user=(User)session.load(User.class,”1”);(1)
System.out.println(user.getName());(2)
 
当运行到(1)处时,Hibernate并没有发起对数据的查询,如果我们此时通过一些调试工具(比如JBuilder2005的Debug工具),观察此时user对象的内存快照,我们会惊奇的发现,此时返回的可能是User$EnhancerByCGLIB$$bede8986类型的对象,而且其属性为null,这是怎么回事?还记得前面我曾讲过session.load()方法,会返回实体对象的代理类对象,这里所返回的对象类型就是User对象的代理类对象。在Hibernate中通过使用CGLIB,来实现动态构造一个目标对象的代理类对象,并且在代理类对象中包含目标对象的所有属性和方法,而且所有属性均被赋值为null。通过调试器显示的内存快照,我们可以看出此时真正的User对象,是包含在代理对象的CGLIB$CALBACK_0.target属性中,当代码运行到(2)处时,此时调用user.getName()方法,这时通过CGLIB赋予的回调机制,实际上调用CGLIB$CALBACK_0.getName()方法,当调用该方法时,Hibernate会首先检查CGLIB$CALBACK_0.target属性是否为null,如果不为空,则调用目标对象的getName方法,如果为空,则会发起数据库查询,生成类似这样的SQL语句:select * from user where id=’1’;来查询数据,并构造目标对象,并且将它赋值到CGLIB$CALBACK_0.target属性中。
   这样,通过一个中间代理对象,Hibernate实现了实体的延迟加载,只有当用户真正发起获得实体对象属性的动作时,才真正会发起数据库查询操作。所以实体的延迟加载是用通过中间代理类完成的,所以只有session.load()方法才会利用实体延迟加载,因为只有session.load()方法才会返回实体类的代理类对象。

 

相关文章:

  • hibernate的lazy策略使用总结
  • springmvc-spring-mybatis实现最简单的登录验证
  • hibernate 的lazy策略存在的问题
  • hibernate中的悲观锁和乐观锁
  • hibernate的查询缓存机制
  • 洛谷 P1521 求逆序对
  • java静态方法的继承
  • Linux内核之内存管理完全剖析
  • 《java与模式》学习系列——简单工厂模式
  • 马尔科夫随机过程的理解
  • 《java与模式》学习系列——工厂模式
  • String a = new String(b);到底是几个对象
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • 《java与模式》学习系列——抽象工厂模式
  • HTTP——学习笔记(7)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Mac转Windows的拯救指南
  • mysql 数据库四种事务隔离级别
  • Next.js之基础概念(二)
  • React的组件模式
  • vue-cli3搭建项目
  • Web标准制定过程
  • 服务器之间,相同帐号,实现免密钥登录
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 移动端 h5开发相关内容总结(三)
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • #单片机(TB6600驱动42步进电机)
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • ()、[]、{}、(())、[[]]命令替换
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (二)c52学习之旅-简单了解单片机
  • (附源码)php新闻发布平台 毕业设计 141646
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .gitattributes 文件
  • .naturalWidth 和naturalHeight属性,
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .net core控制台应用程序初识
  • .NET 设计一套高性能的弱事件机制
  • .Net多线程总结
  • .NET设计模式(8):适配器模式(Adapter Pattern)
  • .NET中两种OCR方式对比
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @Resource和@Autowired的区别
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • [1204 寻找子串位置] 解题报告
  • [20180129]bash显示path环境变量.txt