Session:是應用程序與數據庫之間的一個會話,是Hibernate運作的中心,持久層操作的基礎.對象的生命周期/事務的管理/數據庫的存取都與Session息息相關.
Session對象是通過SessionFactory構建的,下面舉個例子來介紹Hibernate兩種獲取session的方式。
日志,是編程中很常見的一個關注點.用戶在對數據庫進行操作的過程需要將這一系列操作記錄,以便跟蹤數據庫的動態.那么一個用戶在向數據庫插入一條記錄的時候,就要向日志文件中記錄一條記錄,用戶的一系列操作都要在一個Session中進行,否則這就成為了兩個線程.不能保證同步.看下面的代碼
HibernateUtil管理Session的工具類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
package com.bjpowernode.usermgr.util; import org.hibernate.Session; //hibernate3的 import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtils { private static SessionFactory factory; static { try { //讀取hibernate.cfg.xml文件 Configuration cfg= new Configuration().configure(); //建立SessionFactory factory=cfg.buildSessionFactory(); } catch (Exception e){ e.printStackTrace(); } } //獲得開啟著的Session public static Session getSession(){ return factory.openSession(); } //關閉Session public static void closeSession(Session session){ if (session!= null ){ if (session.isOpen()){ session.close(); } } } public static SessionFactory getSessionFactory(){ return factory; } } |
用戶業務邏輯層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
package com.bjpowernode.usermgr.manager; import java.util.Date; import org.hibernate.Session; import com.bjpowernode.usermgr.domain.Log; import com.bjpowernode.usermgr.domain.User; import com.bjpowernode.usermgr.util.HibernateUtils; public class UserManagerImpl implements UserManager { /** * 添加用戶和添加日志都使用了同一個Session,所以 * 當用戶添加失敗的時候,日志也會添加失敗。事務回滾 * 用戶添加成功日志也會添加成功 */ public void addUser(User user) { Session session= null ; try { //取得當前線程Session session=HibernateUtils.getSessionFactory().getCurrentSession(); session.beginTransaction(); //保存用戶 session.save(user); Log log= new Log(); log.setType( "操作日志" ); log.setTime( new Date()); log.setDetail( "XXX" ); LogManager logManager= new LogManagerImpl(); //保存日志 logManager.addLog(log); session.getTransaction().commit(); } catch (Exception e){ e.printStackTrace(); session.getTransaction().rollback(); } } } |
日志實現類:
1
2
3
4
5
6
7
8
9
10
|
package com.bjpowernode.usermgr.manager; import org.hibernate.Session; import com.bjpowernode.usermgr.domain.Log; import com.bjpowernode.usermgr.util.HibernateUtils; public class LogManagerImpl implements LogManager { public void addLog(Log log) { //獲取當前線程的Session HibernateUtils.getSessionFactory().getCurrentSession().save(log); } } |
測試類
1
2
3
4
5
6
7
|
package com.bjpowernode.usermgr.manager; import junit.framework.TestCase; import com.bjpowernode.usermgr.domain.User; public class UserManagerImplTest extends TestCase { public void testAddUser() { UserManager userManager= new UserManagerImpl(); User user= new User(); |
1
2
3
|
user.setName( "張三" ); userManager.addUser(user); } |
注意:
1.openSession和getCurrentSession的區別?
*openSession必須關閉,currentSession在事務結束后自動關閉
*openSession沒有和當前線程綁定,currentSession和當前線程綁定
2.如果使用currentSession需要在hibernate.cfg.xml文件中進行配置:
*如果是本地事務(jdbc事務)
<propertyname="hibernate.current_session_context_class">thread</property>
*如果是全局事務(jta事務)
<propertyname="hibernate.current_session_context_class">jta</property>
全局事務:資源管理器管理和協調的事務,可以跨越多個數據庫和進程。資源管理器一般使用XA二階段提交協議與“企業信息系統”(EIS)或數據庫進行交互。
本地事務:在單個EIS或數據庫的本地并且限制在單個進程內的事務。本地事務不涉及多個數據來源。
總結
以上就是本文關于Hibernate中獲取Session的兩種方式代碼示例的全部內容,希望對大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
原文鏈接:http://blog.csdn.net/yingjiebohe/article/details/8283185