下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、hibernate懒加载详解懒加载为hibernate中比较常用的特性之一,下面我们具体来了解下懒加载的原理和注重事项 load()办法的懒加载原理 在hibernate中,查询办法有两个,分离是get()和load(),这两种办法的不同就是load()拥有懒加载的特性。load()办法就是在查询某一条数据的时候并不会挺直将这条数据以指定对象的形式来返回,而是在你真正需要用法该对象里面的一些属性的时候才会去数据库拜访并得到数据。他的益处就是可以削减程序本身由于与数据库常见的交互造成的处理速度缓慢。 以一个person类做例子,我们写一个查询的办法如下: public ic vo query(i
2、nt id) session session=null; y session=hibernateutil.getsession(); person person=(person) session.load(person.class, id); /system.out.print(person.getname(); ch(hibernateexception) ex.printstacktrace(); finally if(session!=null) session.close(); 然后在hibernate配置文件中添加以下属性 property name= hibernate.show_
3、sql true /property 这条属性的作用为将hibernate运行时产生的每一条sql语句都打印出来 运行上述办法后,我们并没有看到hibernate打印任何查询语句,这时我们可以将注释的语句重新调回归,让他打印查询到的person的name。这时我们可以看到hibernate产生的查询语句并看到person的name属性。这就是懒加载了。 那么在hibernate懒加载的时候,返回的对象是空的吗?答案是否定的,我们可以通过打印person.getclass()办法来验证,打印出来的结果并不是null,而是一个person后面加了一堆很惊奇的字符的类。可以绝对的是懒加载的对象并不是
4、空,而且这个对象的类型不是person类。那么他到底是什么呢? 其实这个兑现我们管它叫做代理对象,而这个对象所属的类是person类的子类,是hibernate自动实现的一个子类。这个子类的特点是:当你拜访person对象的某一个属性的时候,他会自动查询数据库中对应这个对象的数据并返回,这就是为什么在创建对象关系映射的时候要求实体类不能够为final类型的缘由了。 但是这个对象是有一个生命周期的,我们可以改写上述办法如下: public static person query(int id) session session=null; person person=null; try sessi
5、on=hibernateutil.getsession(); person=(person)session.load(person.class, id); /system.out.println(person.getname(); catch(hibernateexceptionex) ex.printstacktrace(); finally if(session!=null) session.close(); return person; 调用这个办法并返回查询到的代理对象,我们可以在返回该对象后打印该对象的name属性,这时会抛出一个org.hibernate.lazyinitializ
6、ationexception异样 这就是懒加载不能初始化异样,这就解释了一件事,懒加载的时候假如想通过代理对象查询数据库,需要在该session关闭以前才可以。但假如一定要在session关闭以后再用法代理对象的话,hibernate中定义了一个初始化代理对象的办法initialize(),通过该办法即可将代理对象初始化。 注:在用法代理对象的getid()办法和getclass()办法的时候,并不会抛出不能初始化异样,由于这两个属性并不用查询数据库。 懒加载可以用于关系映射和集合属性的操作,而且懒加载是可以关闭并打开的,下面我们会按照不同的状况分析一下懒加载。 一对一的懒加载分析 一对一的懒
7、加载并不常用,由于懒加载的目的是为了削减与数据库的交互,从而提高执行效率,而在一对一关系中,主表中的每一条数据只对应从表的一条数据库,就算都查询也不会增强多少交互的成本,而且主表不能有contrain=true,所以主表是不能懒加载的。(从表可以有) 注:当fetch设置为时,懒加载就会失效。由于fetch的作用是抓取方式,他有两个 分离问select和join,默认 为select。即在设为join时,他会挺直将从表信息以join方式查询到而不是再次用法select查询,这样导致了懒加载的失效。 一对多和多对多的懒加载分析 与一对一关联不同,一对多和一对多的关联下,主表的每一条属性都会对应从
8、表的多条数据,这个时候懒加载就显得十分有效了。比如一个部门里面有多个员工,假如没有懒加载,每查询这个部门的时候都会查询出多个员工,这会大大增强与数据库交互的成本。所以hbernate默认的是加入懒加载的。这就是查询集合属性的时候返回的是一个persistentindexed*类型对象的缘由。该对象其实就是一个代理对象。固然,可以在映射文件中通过将lazy属性设为假来禁用。 多对一的懒加载分析 虽然多对一与一对一关系方式相同,但是在hibernate中多对一时,默认是举行懒加载的。另外有一点需要注重的是懒加载并不会区别集合属性里面是否有 ,即使是没有 ,他依旧会用法懒加载,这也是懒加载不够完美的地方之一。 懒加载的一些详情扩充 有的时候,我们在session关闭后仍需要用法懒加载的代理对象来查询数据库,这时我们就需要将代理对象初始化,不过问题是,当我们不能确定初始化后就一定用法该对象的时候怎么办,这样不是又白白铺张了资源吗?我们可以在用法代理对象的办法里面加入一个布尔 参数,这样当我
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 飞机模线样板移型工岗位理论考核试卷含答案
- 电机检修工岗前安全培训考核试卷含答案
- 保险保全员技能实操水平考核试卷含答案
- 2026年城市燃气生产和供应行业洞察报告及未来五至十年发展趋势报告
- 沪教版2025-2026初中物理期末九年级卷
- 2025-2026华东师大五年级语文下册期末卷
- 山东版2025初二语文期末测试卷
- 2026年七年级上册第3章 代数式 第9套 拓展拔高
- 2026年医学医学影像技术学核医学试题及答案
- 2026年医学美学美容技术试题及答案
- 2025-2026学年浙江七彩阳光新高考研究联盟高一上学期期中考英语试题含答案
- 《产品结构设计与实践》 课件汇 第0-4章 绪论、空调遥控器结构设计-果盘一体化结构设计
- 经济学的思维方式全套课件
- 核酸是遗传信息的携带者说课课件-高一上学期生物人教版必修1
- 2025年中国真空杯行业市场前景预测及投资价值评估分析报告
- 水利普法宣传课件
- 江苏省徐州市2024-2025学年七年级上学期期中考试数学试卷(含答案)
- 国网公司选拔专家人才考试题目含答案
- 长期卧床如何预防压疮
- 肠梗阻护理健康宣教
- 康复科患者入院接诊流程
评论
0/150
提交评论