隨筆-124  評論-49  文章-56  trackbacks-0

          lazy策略可以使用在:
             * <class>標簽上,可以取值:true/false
             * <property>標簽上,可以取值:true/false需要類增強工具
             * <set><list>標簽上,可以取值:true/false/extra
             * <one-to-one><many-to-one>單端關聯上,可以取值:false/proxy/noproxy
          lazy概念:只有真正使用該對象時,才會創建,對于hibernate而言,正真使用時才會發出sql

          注意:hibernate支持lazy策略只有在session打開關態下有效
                <class>標簽上的lazy特性只對普通屬性起作用,不會影響到集合上的lazy特性
                <class>標簽上的lazy特性只對普通屬性起作用,不會影響到單端關聯上的lazy特性
          在jsp中使用OpenSessionInview模式,一般采用filter實現


          lazy策略在<class>上
          //設置<class>標簽上的lazy="true",也就是默認配置
              public void testload1(){
                  Session session
          =null;
                  
          try{
                      session
          =HibernateUtils.getSession();
                      session.beginTransaction();
                      
          //不會發sql
                      Group g=(Group)session.load(Group.class1);
                      
          //不會發sql
                      System.out.println(g.getId());
                      
          //會發sql
                      System.out.println(g.getName());
                  
                      session.getTransaction().commit();
                  }
          catch(Exception e){
                      e.printStackTrace();
                      session.getTransaction().rollback();
                  }
          finally{
                      HibernateUtils.closeSession(session);
                  }

              }

              
              
          public void testload2(){
                  Session session
          =null;
                  Group g
          =null;
                  
          try{
                      session
          =HibernateUtils.getSession();
                      session.beginTransaction();
                      
          //不會發sql
                      g=(Group)session.load(Group.class1);
                      
          //不會發sql
                      session.getTransaction().commit();
                  }
          catch(Exception e){
                      e.printStackTrace();
                      session.getTransaction().rollback();
                  }
          finally{
                      HibernateUtils.closeSession(session);
                  }

                  
          //不能正確輸出,拋出lazy初始化lazyInitializationException異常,因為session已經關閉
                  
          //hibernate支持lazy策略只有在session打開關態下有效
                  System.out.println(g.getName());
              }

          lazy策略在<set><list>上
          <class>標簽上的lazy特性只對普通屬性起作用,不會影響到集合上的lazy特性
          //保持lazy是默認配置
          public void testLoad1(){
                  Session session
          =null;
                  
          try{
                      session
          =HibernateUtils.getSession();
                      session.beginTransaction();
                      
          //不會發出sql
                      Classes classes=(Classes)session.load(Classes.class3);
                      
          //會發出sql
                      System.out.println(classes.getName());
                      
          //不會發出sql
                      Set students=classes.getStudents();
                      
          //會發出sql,發出查詢全部數據的sql
                      System.out.println(students.size());
                      session.getTransaction().commit();
                  }
          catch(Exception e){
                      session.getTransaction().rollback();
                      e.printStackTrace();
                  }
          finally{
                      HibernateUtils.closeSession(session);
                  }

              }

              
              
          //設置<class>標簽上的lazy="false"
            public void testLoad1(){
                  Session session
          =null;
                  
          try{
                      session
          =HibernateUtils.getSession();
                      session.beginTransaction();
                      
          //會發出sql
                      Classes classes=(Classes)session.load(Classes.class3);
                      
          //不會發出sql
                      System.out.println(classes.getName());
                      
          //不會發出sql,不會影響集合
                      Set students=classes.getStudents();
                      
          //會發出sql,發出查詢全部數據的sql
                      System.out.println(students.size());
                      session.getTransaction().commit();
                  }
          catch(Exception e){
                      session.getTransaction().rollback();
                      e.printStackTrace();
                  }
          finally{
                      HibernateUtils.closeSession(session);
                  }

              }

              
              
          //設置集合上的lazy="false",其他全為默認
            public void testLoad1(){
                  Session session
          =null;
                  
          try{
                      session
          =HibernateUtils.getSession();
                      session.beginTransaction();
                      
          //不會發出sql
                      Classes classes=(Classes)session.load(Classes.class3);
                      
          //會發出sql,會發出兩條sql分別加載classes和Student
                      System.out.println(classes.getName());
                      
          //不會發出sql
                      Set students=classes.getStudents();
                      
          //不會發出sql
                      System.out.println(students.size());
                      session.getTransaction().commit();
                  }
          catch(Exception e){
                      session.getTransaction().rollback();
                      e.printStackTrace();
                  }
          finally{
                      HibernateUtils.closeSession(session);
                  }

              }

              
                  
          //設置集合上的lazy="extra",其他全為默認(比智能,基本與lazy="true"相同)
              public void testLoad1(){
                  Session session
          =null;
                  
          try{
                      session
          =HibernateUtils.getSession();
                      session.beginTransaction();
                      
          //不會發出sql
                      Classes classes=(Classes)session.load(Classes.class3);
                      
          //會發出sql
                      System.out.println(classes.getName());
                      
          //不會發出sql
                      Set students=classes.getStudents();
                      
          //會發出sql,發出一條比較智能的sql
                      System.out.println(students.size());
                      session.getTransaction().commit();
                  }
          catch(Exception e){
                      session.getTransaction().rollback();
                      e.printStackTrace();
                  }
          finally{
                      HibernateUtils.closeSession(session);
                  }

              }

          lazy策略在<one-to-one><many-to-one>單端關聯上
          可以取值:false/proxy/noproxy,默認為proxy,noproxy為不用代理,使用自解碼,要使用增強工具
          //所有lazy全為默認
          public void testload1(){
                  Session session
          =null;
                  
          try{
                      session
          =HibernateUtils.getSession();
                      session.beginTransaction();
                      
          //不會發出sql
                      User user=(User)session.load(User.class3);
                      
          //會發出sql
                      System.out.println(user.getName());
                      
          //不會發出sql
                      Group group=user.getGroup();
                      
          //會發出sql
                      System.out.println(group.getName());
                      session.getTransaction().commit();
                  }
          catch(Exception e){
                      e.printStackTrace();
                      session.getTransaction().rollback();
                  }
          finally{
                      HibernateUtils.closeSession(session);
                  }

              }

              
              
          //設置<many-to-one>的lazy="false",其他全為默認,效果同集合
          public void testload1(){
                  Session session
          =null;
                  
          try{
                      session
          =HibernateUtils.getSession();
                      session.beginTransaction();
                      
          //不會發出sql
                      User user=(User)session.load(User.class3);
                      
          //會發出sql,會發出兩條sql分別加載Group和User
                      System.out.println(user.getName());
                      
          //不會發出sql
                      Group group=user.getGroup();
                      
          //不會發出sql
                      System.out.println(group.getName());
                      session.getTransaction().commit();
                  }
          catch(Exception e){
                      e.printStackTrace();
                      session.getTransaction().rollback();
                  }
          finally{
                      HibernateUtils.closeSession(session);
                  }

              }

              
              
          //設置<class>標簽上的lazy="false",其他全默認,效果同集合
              <class>標簽上的lazy特性只對普通屬性起作用,不會影響到<many-to-one>的lazy特性
              
          public void testload1(){
                  Session session
          =null;
                  
          try{
                      session
          =HibernateUtils.getSession();
                      session.beginTransaction();
                      
          //會發出sql
                      User user=(User)session.load(User.class3);
                      
          //不會發出sql
                      System.out.println(user.getName());
                      
          //不會發出sql,不會影響到<many-to-one>
                      Group group=user.getGroup();
                      
          //會發出sql
                      System.out.println(group.getName());
                      session.getTransaction().commit();
                  }
          catch(Exception e){
                      e.printStackTrace();
                      session.getTransaction().rollback();
                  }
          finally{
                      HibernateUtils.closeSession(session);
                  }

              }

          posted on 2009-11-03 16:33 junly 閱讀(533) 評論(0)  編輯  收藏 所屬分類: hibernate/orm
          主站蜘蛛池模板: 吉首市| 乌兰浩特市| 北海市| 盐池县| 龙门县| 万盛区| 车险| 渝中区| 南靖县| 咸阳市| 尤溪县| 饶平县| 汾阳市| 土默特左旗| 贞丰县| 长宁县| 武汉市| 陆川县| 崇阳县| 泰安市| 池州市| 博客| 正定县| 旬阳县| 青岛市| 读书| 改则县| 铁岭市| 彭阳县| 德化县| 宽城| 三门峡市| 侯马市| 龙川县| 靖边县| 赤城县| 同江市| 洞头县| 于都县| 安阳县| 奉节县|