Hibernate中同一個執行緒獲取相同session
阿新 • • 發佈:2019-01-23
為什麼
在Hibernate中事物是與session相關的,一般情況下session會在Service層建立,
Service中
Session session = HibernateUtils.openSession()
tx = session.beginTransaction();
dao.save();
dao.xxx();
tx.commit();
在Dao中就需要使用session.save()或者session.xxx(),而為了在同一個事物中執行這兩個方法,所以在這兩個方法中應該使用與Service中一樣的session
怎麼辦
一將session傳遞給dao層,即給為dao.save(session,obj)
二session物件的生命週期與當前執行緒繫結
1.在hibernate.cfg.xml中定義常量
<property name="hibernate.current_session_context_class">thread</property>
2.使用
在HibernateUtils裡面新增一個方法
public Session getCurrentSession(){
return sessionFactory.getCurrentSession;
}
3.注意
通過該方法獲得的session物件,都不需要手動關閉,因為噹噹前執行緒結束的時候會自動關閉該session,如果手動呼叫的話還會出錯
因為如果已經手動關掉了,執行緒結束的時候又關掉一次,就是重複關閉一個物件,顯然會出錯