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)
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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.