hibernate openSession和getCurrentSession

開啓一個Session 的兩種方式:

    1.openSession:每次都是一個新的Session
    2.getCurrentSession:如果當前有session,就用當前的,否則新建一個
        2.1.用途:界定事務邊界
        2.2. 在事務提交的時候自動close
        2.3.必須在配置文件中配置,這個屬性可以再文檔中查找

        <property name="hibernate.current_session_context_class">thread</property>

        如果配置文件中沒有設置,運行時會報異常No CurrentSessionContext configured,getCurrentSession是hibernate3.0以後加進去的新API,通過查看hibernate文檔,我們可以知道hibernate默認是jta事務管理,所以單獨用java應用程序測試是會報這樣的異常的

還有一個問題:

假定SessionFactory實例已經被創建

     Session session1=sessionFactory.openSession();

     Session session2=sessionFactory.getCurrentSession();

     System.out.println(session1==session2);//結果爲false

原因:Session是一個接口,可能兩個方法返回的是不同實現,具體得看hibernate源碼才能知道

如果把好幾個數據庫操作放在同一個事務中,光靠數據庫本身的connection管理根本不行,往往需要別人給你做一個事務管理器(TransactionManager)(記錄對數據庫的操作)
如果其中第二個數據庫的操作出錯,就讓讓第一個數據庫回滾     XADriver驅動(支持對不同數據庫操作)
TransactionManager有應用程序服務器提供,tomcat目前還不支持,不過可以通過spring來實現,weblogic可以,jboss可以
依賴於數據庫本身,是Connection事務
分佈式的數據庫處理,依賴於應用程序服務器,叫jta事務
jta(java transaction API)                    
            



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章