zoukankan      html  css  js  c++  java
  • 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语句,从数据库加载所有数据。

  • 相关阅读:
    Map
    Enumeration输出
    iterator的基本用法
    Annotation整合工厂设计模式
    自定义Annotation
    Annotation
    动态代理设计模式
    静态代理设计模式
    自定义ClassLoader
    获取类的类对象的几种方式
  • 原文地址:https://www.cnblogs.com/qinjf/p/9061124.html
Copyright © 2011-2022 走看看