Hibernate的检索策略

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语句,从数据库加载所有数据。

posted @ 2018-05-19 18:02  秦先生的客栈  Views(136)  Comments(0Edit  收藏  举报