Atea - Hero's Grave

          面向對象,開源,框架,敏捷,云計算,NoSQL,商業智能,編程思想。

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            40 隨筆 :: 0 文章 :: 28 評論 :: 0 Trackbacks
          Hibernate Session獲取方法大致有兩種:
          方法1. SessionFactory.openSession();
          方法2. SessionFactory.getCurrentSession();
          以前自己寫代碼都是用方法1取session。今天學會了方法2,以后就可以用它來提高效率了:

          1.在xml或properties文件里設置current_session_context_class,例如:
          hibernate.current_session_context_class=thread
          這里用的是基于ThreadLocal的ThreadLocalSessionContext類。Hibernate還提供了其他的類,近期計劃學習一下JTA。
          2.然后就可以取Session了:
          Session sessionOne = factory.getCurrentSession();
          之后當我對Session操作的時候拋出了"*** is not valid without active transaction"的異常,查資料才發現用方法2取得的Session必須和Transaction配套使用,即使只是進行search操作:
          sessionOne.beginTransaction();
          //CRUD..

          最后貼一段代碼:
          @Test    
          public void testSession() throws Exception{      
                  
              Session sessionOne 
          = factory.getCurrentSession();        
              sessionOne.beginTransaction();
          //important.
              System.out.println("session1: " + sessionOne.getFlushMode() );
                  
              Session sessionTwo 
          = factory.getCurrentSession();
              sessionTwo.beginTransaction();
              System.out.println(
          "session2: " + sessionTwo.getFlushMode() );
                  
              sessionOne.setFlushMode(FlushMode.ALWAYS);
              System.out.println(
          "session1: " + sessionOne.getFlushMode() );
              System.out.println(
          "session2: " + sessionTwo.getFlushMode() );
                  
              
          //notice!
              System.out.println("sessionOne equals sessionTwo? " + (sessionOne.equals(sessionTwo)) );                
                  
              
          //need not.
              
          //sessionOne.close();
              
          //sessionTwo.close();

              //2009/02/09 更新
              //在用getCurrentSession獲得session的時候,如果transaction.commit()的話,session會自動被關閉。
              //如果沒有commit的話,還是需要手動關閉才行!


          }
          Print out:
          session1: AUTO
          session2: AUTO
          session1: ALWAYS
          session2: ALWAYS
          sessionOne equals sessionTwo? false
          posted on 2008-07-28 16:57 Atea 閱讀(3471) 評論(0)  編輯  收藏 所屬分類: Hibernate
          主站蜘蛛池模板: 建湖县| 临漳县| 宁安市| 宾阳县| 西乌珠穆沁旗| 潍坊市| 西青区| 龙里县| 乌兰察布市| 上林县| 安西县| 平山县| 米易县| 富蕴县| 鄱阳县| 石泉县| 乌鲁木齐市| 惠州市| 庆安县| 天峨县| 乐山市| 嘉义县| 类乌齐县| 司法| 疏勒县| 合水县| 庆城县| 宿州市| 垦利县| 定陶县| 仁寿县| 阳新县| 左贡县| 连云港市| 阜南县| 乃东县| 丰顺县| 基隆市| 永定县| 兴文县| 客服|