阿寶 Keep Walking......


          JUST DO IT, DO YOUR BEST ! -- 勿在浮沙筑高臺(tái)

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            49 Posts :: 6 Stories :: 26 Comments :: 0 Trackbacks

          如果在hibernate.cfg.xml中配置了
          ??<property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>?
          ??<property name="hibernate.transaction.factory_class">org.hibernate.transaction.CMTTransactionFactory</property>
          ??<property
          name="hibernate.current_session_context_class">jta</property>
          這個(gè)配置的意思是當(dāng)前對(duì)于這個(gè)SessionFactory(org.hibernate.transaction.CMTTransactionFactory的實(shí)例)來說,方法getCurrentSessiong()這個(gè)操作都應(yīng)該在Container Manager Transaction中進(jìn)行的,此時(shí)這個(gè)方法會(huì)將Session和Transaction進(jìn)行綁定,對(duì)于應(yīng)用來說則只需調(diào)用getCurrentSession就可以了,無需關(guān)心Session的Commit和Close.但是如果不是在一個(gè)Container Manager Transaction的Bean中調(diào)用SessionFactory.getCurrentSession(),則會(huì)拋出如下"org.hibernate.HibernateException: Unable to locate current JTA transaction"
          ,我想是因?yàn)槿萜鳑]有為當(dāng)前的Bean開始事務(wù),所以這個(gè)方法無法綁定Session到當(dāng)前的JTA transaction中去.

          所以在配置前要想清楚是不是所有的操作都是在CMT中進(jìn)行的,如果不是的話,不能夠進(jìn)行這樣的操作.在一個(gè)應(yīng)用中,往往有多個(gè)senarior,有的是通過CMT的session bean來調(diào)用,而有的則是通過Service直接調(diào)用DAO,要解決這個(gè)問題的話,可以配置多個(gè)SessiongFactory,將其Bind到容器的JNDI樹中去.在調(diào)用的時(shí)候根據(jù)當(dāng)前的Senaior來取不同的SessionFactory.

          例如可以為所有通過的CMT管理的Bean作上述配置,對(duì)于BMT管理的配置如下:
          ??<property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>?
          ??<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
          ??<property
          name="hibernate.current_session_context_class">jta</property>
          使用的代碼如下:
          //BMTidiomwithgetCurrentSession()
          try{
          ?UserTransactiontx=(UserTransaction)newInitialContext()
          ?.lookup("java:comp/UserTransaction");
          ?tx.begin();
          ?//DosomeworkonSessionboundtotransaction
          ?factory.getCurrentSession().load(...);
          ?factory.getCurrentSession().persist(...);
          ?tx.commit();
          }
          catch(RuntimeExceptione){
          ?tx.rollback();
          ?throwe;//ordisplayerrormessage
          }

          其實(shí)這里與CMT不同的就是要手動(dòng)開始一個(gè)Transaction,SessionFactory檢查這個(gè)Transaction是否是Begin,然后綁定一個(gè)Session到這個(gè)Transaction上去.

          如果是在非托管的環(huán)境的應(yīng)用的話,用JDBCTransactionFactory就可以了,另外對(duì)于hibernate.current_session_context_class可以設(shè)置為Thread,通過Session.getCurrentSesion()這個(gè)方法,讓每個(gè)Thread公用一個(gè)session,同樣你也無須關(guān)心Sesion的打開和關(guān)閉.
          //Non-managedenvironmentidiomwithgetCurrentSession()
          try{
          ?factory.getCurrentSession().beginTransaction();
          ?//dosomework
          ?...
          ?factory.getCurrentSession().getTransaction().commit();
          }
          catch(RuntimeExceptione){
          ?factory.getCurrentSession().getTransaction().rollback();
          ?throwe;//ordisplayerrormessage
          }
          注意如果采取這種方式獲得Session,即使對(duì)查詢語句也需要開始事務(wù),否則會(huì)拋異常.
          org.hibernate.HibernateException: createSQLQuery is not valid without active transaction

          如果對(duì)于CMT,BMT和非托管環(huán)境都要用到的,則不再適合用SessionFactory.getCurrentSession(),而需要用OpenSession,并自己負(fù)責(zé)事務(wù)的提交以及Sesion的Close.

          posted on 2006-05-28 01:34 阿寶 閱讀(7004) 評(píng)論(1)  編輯  收藏

          Feedback

          # re: Hibernat 的SessionFactory的getCurrentSesion()方法詳解 2006-11-17 03:01 吳克
          JTA和CMT有什么區(qū)別嗎?我感覺沒什么區(qū)別嗎?一個(gè)是使用,一個(gè)是聲名,jdbc倒是和他們的區(qū)別很大!!  回復(fù)  更多評(píng)論
            


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 延安市| 马尔康县| 杭锦后旗| 盐津县| 汕头市| 辽阳市| 探索| 嘉禾县| 唐海县| 兴安县| 兴隆县| 邓州市| 长沙市| 秀山| 廊坊市| 泰顺县| 上蔡县| 北流市| 枝江市| 福州市| 定远县| 容城县| 景东| 达日县| 苍梧县| 吉林市| 绿春县| 昆山市| 元谋县| 云和县| 赫章县| 壶关县| 紫金县| 买车| 亳州市| 大英县| 定西市| 手游| 勃利县| 宾阳县| 巴中市|