zoukankan      html  css  js  c++  java
  • Hibernate延迟加载

    Hibernate延迟加载
        
        1. 延迟加载先获取到代理对象,当真正使用到该对象中的属性的时候,才会发送SQL语句,是Hibernate框架提升性能的方式
        2. 类级别的延迟加载
            * Session对象的load方法默认就是延迟加载
            * Customer c = session.load(Customer.class, 1L);没有发送SQL语句,当使用该对象的属性时,才发送SQL语句
            
            * 使类级别的延迟加载失效
                * 在<class>标签上配置lazy=”false”
                * Hibernate.initialize(Object proxy);
        
        3. 关联级别的延迟加载(查询某个客户,当查看该客户下的所有联系人是是否是延迟加载)
            * 默认是延迟加载
          

         Session session = HibernateUtils.getCurrentSession();
                Transaction tr = session.beginTransaction();
                Customer c = session.get(Customer.class, 1L);
                System.out.println("=============");
                System.out.println(c.getLinkmans().size());
                tr.commit();
        

       
    技术分析之Hibernate框架的查询策略
        
        1. 查询策略:使用Hibernate查询一个对象的时候,查询其关联对象.应该如何查询.是Hibernate的一种优化手段!!!  

     
        2. Hibernate框架的检索策略解决的问题
            * 查询的时机

       Customer c1 = (Customer) session.get(Customer.class, 1);
                System.out.println(c1.getLinkmans().size());   

                * lazy属性解决查询的时机的问题,需要配置是否采用延迟加载!!
            
            * 查询的语句形式
             

      List<Customer> list = session.createQuery("from Customer").list();
                for(Customer c : list){
                    System.out.println(c.getLinkmans());
                }

               
                * fetch属性就可以解决查询语句的形式的问题!!
        

        
    技术分析之在set标签上配置策略
        
        1. 在<set>标签上使用fetch和lazy属性
            * fetch的取值                -- 控制SQL语句生成的格式
                * select                -- 默认值.发送查询语句
                * join                    -- 连接查询.发送的是一条迫切左外连接!!!配置了join.lazy就失效了
                * subselect                -- 子查询.发送一条子查询查询其关联对象.(需要使用list()方法进行测试)
            
            * lazy的取值                -- 查找关联对象的时候是否采用延迟!
                * true                    -- 默认.延迟
                * false                    -- 不延迟
                * extra                    -- 及其懒惰
        
        2. set标签上的默认值是fetch="select"和lazy="true"
        
        3. 总结:Hibernate框架都采用了默认值,开发中基本上使用的都是默认值。特殊的情况。
        

        
    技术分析之在man-to-one标签上配置策略
        
        1. 在<many-to-one>标签上使用fetch和lazy属性
            * fetch的取值        -- 控制SQL的格式.
                * select        -- 默认。发送基本select语句查询
                * join            -- 发送迫切左外连接查询
            
            * lazy的取值        -- 控制加载关联对象是否采用延迟.
                * false            -- 不采用延迟加载.
                * proxy            -- 默认值.代理.现在是否采用延迟.
                    * 由另一端的<class>上的lazy确定.如果这端的class上的lazy=”true”.proxy的值就是true(延迟加载).
                    * 如果class上lazy=”false”.proxy的值就是false(不采用延迟.)
        
        2. 在<many-to-one>标签上的默认值是fetch="select"和proxy
     

  • 相关阅读:
    bzoj 4606: [Apio2008]DNA【dp】
    UOJ #206. 【APIO2016】Gap【交互题】
    bzoj 4071: [Apio2015]巴邻旁之桥【splay】
    bzoj 4069: [Apio2015]巴厘岛的雕塑【dp】
    bzoj 4070: [Apio2015]雅加达的摩天楼【spfa】
    洛谷 P3625 [APIO2009]采油区域【枚举】
    bzoj 1178: [Apio2009]CONVENTION会议中心(少见做法掉落!)【贪心+二分】
    bzoj 1179: [Apio2009]Atm【tarjan+spfa】
    洛谷 P3621 [APIO2007]风铃【贪心】
    bzoj 4898: [Apio2017]商旅【Floyd+分数规划+二分】
  • 原文地址:https://www.cnblogs.com/lxp503238/p/6775304.html
Copyright © 2011-2022 走看看