Session的缓存中可以存放相互关联的对象。当Hibernate从数据库中加载对象时,如果同时自动加载与之关联的所有对象,那么这些关联的对象就浪费了很多的内存空间。而我们可以设置检索策略,来优化检索性能。
Hibernate提供了三种检索策略
- -立即检索策略:检索对象时立即加载对象以及关联的对象。
- -延迟检索策略:使用时才会加载对象以及关联的对象。能避免多余加载不需要的对象。
- -迫切左外连接检索策略 :利用SQL的外连接查询功能,能够减少select语句的数目。
类级别检索策略
定义:只加载某个类对象
类级别的检索策略包括立即检索和延迟检索。默认为延迟检索。
Hibernate中允许在映射文件中配置检索策略。
类级别检索策略,可以配置<class>元素中的lazy属性。属性可选值:true(延迟检索) false(立即检索)。默认值为true。
类级别检索策略会影响Session的load方法。
public class Demo { private Session session; @Test public void test() { //读取配置文件 Configuration conf=new Configuration().configure(); //根据配置创建factory SessionFactory sessionfactory=conf.buildSessionFactory(); session = sessionfactory.openSession(); Transaction ts=session.beginTransaction(); Customer c=session.load(Customer.class, 7);//此处加断点来观察效果 System.out.println(c.getName()); ts.commit(); session.close(); sessionfactory.close(); } }
当lazy属性为true时,调用load方法什么都不输出,使用对象时才输出select语句。
当lazy属性为false时,调用load方法会直接输出select语句。
原理:当为延迟检索策略时,执行load方法时,是返回当前对象的代理对象,这个代理对象由Hibernate动态生成,代理对象继承了当前对象,仅仅初始化了OID属性,其他属性都为null,当程序访问代理类属性时,Hibernate才会初始化代理对象,初始化过程执行select语句,从数据库加载所有数据。