一,openSessioin方式開啟或者關閉事務
Session session = null;
try {
session = HibernateUtils.getSession();
session.beginTransaction();//開啟事務
//TODO:各類CRUD操作
session.getTransaction().commit(); //提交事務
} catch (Exception e) {
e.printStackTrace();
session.getTransaction().rollback(); //出錯回滾
} finally {
HibernateUtils.closeSession(session); //關閉session
}
使用這種方式開啟和關閉事務,但是考慮到我們的事物一般都是在Service層開啟或者關閉的,而service裡面在調用Dao層方法的時候,大部分情況下,都是調用多個方法,即一對多的調用,要想保證我每次開啟事務的時候,用的都是一個Session,上面這種簡陋的方法就不行了。
二,getCurrentSession使用事務
1,添加使用currentSession的配置
<property name="hibernate.current_session_context_class">thread</property><!-- 將session放到threadLoacl裡面 -->
2,替換getSession方法
對與如下圖,其中要在單元測試類中添加測試用戶方法:
代碼:
每次獲取session的時候,使用getCurrentSession方法,獲取當前線程使用的Session。同樣,在添加log的時候
也使用上面方法獲取session,這樣就能保證我一連串的CRUD操作的時候,使用的是一個Session。
小結:
*openSession是必須要關閉session的,而currentSession是在事務結束之後自動關閉session
*opsenSession沒有和當前線程綁定,currentSession和當前線程綁定了
*使用currentSession的時候需要在hibernate的配置文件中進行配置
Hibernate學習入門教程 http://www.linuxidc.com/Linux/2015-08/121498.htm
在Hibernate中開啟日志 http://www.linuxidc.com/Linux/2015-07/120499.htm
Hibernate+JUnit測試實體類生成數據庫表 http://www.linuxidc.com/Linux/2015-07/120161.htm
Hibernate整體理解 http://www.linuxidc.com/Linux/2014-07/104405.htm
Hibernate的映射機制 http://www.linuxidc.com/Linux/2014-12/110265.htm
Hibernate 的詳細介紹:請點這裡
Hibernate 的下載地址:請點這裡