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

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

          注意:hibernate支持lazy策略只有在session打開關(guān)態(tài)下有效
                <class>標(biāo)簽上的lazy特性只對普通屬性起作用,不會影響到集合上的lazy特性
                <class>標(biāo)簽上的lazy特性只對普通屬性起作用,不會影響到單端關(guān)聯(lián)上的lazy特性
          在jsp中使用OpenSessionInview模式,一般采用filter實(shí)現(xiàn)


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

                  
          //不能正確輸出,拋出lazy初始化lazyInitializationException異常,因?yàn)閟ession已經(jīng)關(guān)閉
                  
          //hibernate支持lazy策略只有在session打開關(guān)態(tài)下有效
                  System.out.println(g.getName());
              }

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

              }

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

              }

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

              }

              
                  
          //設(shè)置集合上的lazy="extra",其他全為默認(rèn)(比智能,基本與lazy="true"相同)
              public void testLoad1(){
                  Session session
          =null;
                  
          try{
                      session
          =HibernateUtils.getSession();
                      session.beginTransaction();
                      
          //不會發(fā)出sql
                      Classes classes=(Classes)session.load(Classes.class3);
                      
          //會發(fā)出sql
                      System.out.println(classes.getName());
                      
          //不會發(fā)出sql
                      Set students=classes.getStudents();
                      
          //會發(fā)出sql,發(fā)出一條比較智能的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>單端關(guān)聯(lián)上
          可以取值:false/proxy/noproxy,默認(rèn)為proxy,noproxy為不用代理,使用自解碼,要使用增強(qiáng)工具
          //所有l(wèi)azy全為默認(rèn)
          public void testload1(){
                  Session session
          =null;
                  
          try{
                      session
          =HibernateUtils.getSession();
                      session.beginTransaction();
                      
          //不會發(fā)出sql
                      User user=(User)session.load(User.class3);
                      
          //會發(fā)出sql
                      System.out.println(user.getName());
                      
          //不會發(fā)出sql
                      Group group=user.getGroup();
                      
          //會發(fā)出sql
                      System.out.println(group.getName());
                      session.getTransaction().commit();
                  }
          catch(Exception e){
                      e.printStackTrace();
                      session.getTransaction().rollback();
                  }
          finally{
                      HibernateUtils.closeSession(session);
                  }

              }

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

              }

              
              
          //設(shè)置<class>標(biāo)簽上的lazy="false",其他全默認(rèn),效果同集合
              <class>標(biāo)簽上的lazy特性只對普通屬性起作用,不會影響到<many-to-one>的lazy特性
              
          public void testload1(){
                  Session session
          =null;
                  
          try{
                      session
          =HibernateUtils.getSession();
                      session.beginTransaction();
                      
          //會發(fā)出sql
                      User user=(User)session.load(User.class3);
                      
          //不會發(fā)出sql
                      System.out.println(user.getName());
                      
          //不會發(fā)出sql,不會影響到<many-to-one>
                      Group group=user.getGroup();
                      
          //會發(fā)出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 閱讀(534) 評論(0)  編輯  收藏 所屬分類: hibernate/orm
          主站蜘蛛池模板: 凤山市| 化德县| 双鸭山市| 蒙自县| 玉溪市| 金昌市| 女性| 册亨县| 隆化县| 胶南市| 长武县| 广宗县| 柳州市| 保亭| 象州县| 论坛| 长顺县| 建水县| 高要市| 乐昌市| 五指山市| 潍坊市| 辽阳市| 隆林| 岫岩| 奉节县| 平度市| 高清| 东光县| 息烽县| 宁德市| 和硕县| 泌阳县| 玛多县| 佛山市| 沾益县| 台中市| 淮安市| 钦州市| 冀州市| 嵊泗县|