[size=large]
先看一段代码:
public class LazyLoadTest {
@Test
public void showLazyLoad(){
Session session=HibernateUtil.getSession();
Major major=(Major) session.load(Major.class, 1);
session.close();
//print the name of this major
System.out.println(major.getName());
}
}
代码的逻辑是:查询出id为1的major, 并输出其名字. 很明显, 代码的逻辑是对的. 可一运行就会报错:
引用
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
翻译过来就是: 延迟加载异常:不能初始化代理 --- session不存在. 出现这个报错信息的原因就在于hibernate的延迟加载机制.
所谓的延迟加载就是程序在使用load, iterator方法执行查询及关联查询时, 并不会马上发送并执行sql语句, 而是在调用(被查询)对象属性的getter方法时才去执行查询.
所以若将代码改为:
Major major=(Major) session.load(Major.class, 1);
major.getName();
session.close();
System.out.println(major.getName());
则能正常运行
可这样做了无用功, 因为major.getName()方法的调用没有体现出任何业务逻辑.应通过使用不同的方法来避免延迟加载.如:
Major major=(Major) session.get(Major.class, 1);
session.close();
System.out.println(major.getName());
将load方法替换为get方法后程序也能正常运行.
hibernate延迟加载机制是默认开启的, 但只在三种情况下出现延迟加载:使用session的load方法, query的iterator方法进行查询及关联查询时. 相应的避免方法为:
session.load--->session.get
query.iterator---> query.list
关联查询:有两种方法:a.修改配置文件:在映射文件中给关联映射元素添加fetch='join'属性; b.在hql语句中使用join fetch 关键字. a不如b灵活, 建议使用b.
还有一个小小的陷阱:
Major major=(Major) session.load(Major.class, 1);
major.getId();
session.close();
System.out.println(major.getName());
猜猜看这段代码是否能正常运行? 用load方法将major查询出来后调用其id属性的get方法, 照理说应该能正常运行, 但结果却会报错, 错误信息和第一段代码一样.
这又是什么原因呢? 原来在使用load方法时, major对象的id属性已经给出了, 在调用其id的get方法时不需要执行查询操作.所以major.getId();这句代码有和没有是一个样, 程序都不会去执行真正的查询操作.
上面这些现象也许会让人觉得它的存在纯粹是一个麻烦精, 可事实是延迟加载的好处是大大的有: 它可以降低数据库访问的并发率, 还可以极大的提高关联查询的效率, 因为它使程序在查询数据时可以做到用到时才查, 不用时不查, 减少了不必要的内存开销.
所以hibernate延迟加载机制的存在有理由,有好处,也有坏处. 在使用时只要注意不过早关闭session,就会发现它还是挺好用的.
(数据库表格见http://keepcrazy.iteye.com/blog/1753444的附件)
[/size]
分享到:
相关推荐
Hibernate延迟加载以及利用Spring 大家看看 参考一下
详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助
hibernate延迟加载解决 延迟加载的具体解决方法
Hibernate延迟加载机制.zip
深入理解hibernate懒加载技术,正确使用懒加载
Hibernate延迟加载Hibernate延迟加载
Hibernate 延迟加载
Hibernate延时加载与lazy机制.docHibernate延时加载与lazy机制.doc
Hibernae 的延迟加载是一个非常常用的技术,实体的集合属性默认会被延迟加载,实体所关联的实体默认也会被延迟加载。Hibernate 通过这种延迟加载来降低系统的内存开销,从而保证 Hibernate 的运行性能。
hibernate延迟加载技术详细解 ,http://www.che2.com/提供
jsp中关于Hibernate延时加载的问题,实例源代码,详解都有
Hibernate延迟加载介绍.doc
关于hibernate延迟加载,有很好的参考价值
Hibernate在查询某个对象时,立即查询与之关联的对象: 1、当select的语句数目太多,需要频繁的访问数据库,会影响查询的性能。 2、在应用程序只需要访问要的对象,而不需要访问与他关联的对象的场景下,加载与之...
主要介绍了Hibernate延迟加载技术,结合实例形式详细分析了Hibernate延迟加载所涉及的各种常用技巧,需要的朋友可以参考下
主要介绍了Hibernate延迟加载原理与实现方法,较为详细的分析了Hibernate延迟加载的概念,原理与相关实现技巧,需要的朋友可以参考下