<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    阿寶 Keep Walking......


    JUST DO IT, DO YOUR BEST ! -- 勿在浮沙筑高臺

      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>
    這個配置的意思是當前對于這個SessionFactory(org.hibernate.transaction.CMTTransactionFactory的實例)來說,方法getCurrentSessiong()這個操作都應(yīng)該在Container Manager Transaction中進行的,此時這個方法會將Session和Transaction進行綁定,對于應(yīng)用來說則只需調(diào)用getCurrentSession就可以了,無需關(guān)心Session的Commit和Close.但是如果不是在一個Container Manager Transaction的Bean中調(diào)用SessionFactory.getCurrentSession(),則會拋出如下"org.hibernate.HibernateException: Unable to locate current JTA transaction"
    ,我想是因為容器沒有為當前的Bean開始事務(wù),所以這個方法無法綁定Session到當前的JTA transaction中去.

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

    例如可以為所有通過的CMT管理的Bean作上述配置,對于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
    }

    其實這里與CMT不同的就是要手動開始一個Transaction,SessionFactory檢查這個Transaction是否是Begin,然后綁定一個Session到這個Transaction上去.

    如果是在非托管的環(huán)境的應(yīng)用的話,用JDBCTransactionFactory就可以了,另外對于hibernate.current_session_context_class可以設(shè)置為Thread,通過Session.getCurrentSesion()這個方法,讓每個Thread公用一個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,即使對查詢語句也需要開始事務(wù),否則會拋異常.
    org.hibernate.HibernateException: createSQLQuery is not valid without active transaction

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

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

    Feedback

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


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


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 四虎在线免费视频| 91香蕉国产线观看免费全集| 97无码免费人妻超级碰碰碰碰| a毛片免费播放全部完整| 国产精品爱啪在线线免费观看| 国产亚洲精品观看91在线| 亚洲va无码手机在线电影| 亚洲综合激情五月色一区| 精品国产sm捆绑最大网免费站| 亚洲精品国产成人中文| h视频在线观看免费完整版| 亚洲黄色网址在线观看| 美女免费精品高清毛片在线视| 国产在线不卡免费播放| 亚洲无线电影官网| 永久免费观看黄网站| 国产亚洲精品无码专区| 国产亚洲sss在线播放| 在线播放免费播放av片| 久久精品国产亚洲AV| 一区二区免费视频| 亚洲国产美女精品久久| 免费观看的av毛片的网站| 国产亚洲蜜芽精品久久| 久久精品国产亚洲一区二区三区| 在线观看人成视频免费无遮挡 | 2019中文字幕免费电影在线播放| 亚洲男人天堂影院| 国产成人免费高清在线观看| www在线观看免费视频| 免费观看美女裸体网站| 永久免费无码日韩视频| 国产l精品国产亚洲区在线观看| 亚洲一区二区在线免费观看| 亚洲日本成本人观看| 国产精品视频免费观看| 美女视频黄.免费网址| 亚洲精品福利视频| 国产精品酒店视频免费看| 最近免费字幕中文大全| 亚洲高清视频在线|