Session:是應用程序與數據庫之間的一個會話,是Hibernate運作的中心,持久層操作的基礎.對象的生命週期/事務的管理/數據庫的存取都與Session息息相關.
Session對像是通過SessionFactory構建的,下面舉個例子來介紹Hibernate兩種獲取session的方式。
日誌,是編程中很常見的一個關注點.用戶在對數據庫進行操作的過程需要將這一系列操作記錄,以便跟踪數據庫的動態.那麼一個用戶在向數據庫插入一條記錄的時候,就要向日誌文件中記錄一條記錄,用戶的一系列操作都要在一個Session中進行,否則這就成為了兩個線程.不能保證同步.看下面的代碼
HibernateUtil管理Session的工具類
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;}}用戶業務邏輯層
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();}}}日誌實現類:
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);}}測試類
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(); 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的兩種方式代碼示例的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱:
hibernate通過session實現增刪改查操作實例解析
快速了解Hibernate中的Session
Hibernate使用hbm.xml配置映射關係解析
如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!