Hibernate中獲取Session的兩種方式代碼示例
Session:是應(yīng)用程序與數(shù)據(jù)庫之間的一個會話,是Hibernate運作的中心,持久層操作的基礎(chǔ).對象的生命周期/事務(wù)的管理/數(shù)據(jù)庫的存取都與Session息息相關(guān).
Session對象是通過SessionFactory構(gòu)建的,下面舉個例子來介紹Hibernate兩種獲取session的方式。
日志,是編程中很常見的一個關(guān)注點.用戶在對數(shù)據(jù)庫進(jìn)行操作的過程需要將這一系列操作記錄,以便跟蹤數(shù)據(jù)庫的動態(tài).那么一個用戶在向數(shù)據(jù)庫插入一條記錄的時候,就要向日志文件中記錄一條記錄,用戶的一系列操作都要在一個Session中進(jìn)行,否則這就成為了兩個線程.不能保證同步.看下面的代碼
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(); } //關(guān)閉Session public static void closeSession(Session session){ if(session!=null){ if(session.isOpen()){ session.close(); } } } public static SessionFactory getSessionFactory(){ return factory; } }
用戶業(yè)務(wù)邏輯層
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,所以 * 當(dāng)用戶添加失敗的時候,日志也會添加失敗。事務(wù)回滾 * 用戶添加成功日志也會添加成功 */ public void addUser(User user) { Session session=null; try{ //取得當(dāng)前線程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(); } } }
日志實現(xiàn)類:
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) { //獲取當(dāng)前線程的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的區(qū)別?
*openSession必須關(guān)閉,currentSession在事務(wù)結(jié)束后自動關(guān)閉
*openSession沒有和當(dāng)前線程綁定,currentSession和當(dāng)前線程綁定
2.如果使用currentSession需要在hibernate.cfg.xml文件中進(jìn)行配置:
*如果是本地事務(wù)(jdbc事務(wù))
<propertyname="hibernate.current_session_context_class">thread</property>
*如果是全局事務(wù)(jta事務(wù))
<propertyname="hibernate.current_session_context_class">jta</property>
全局事務(wù):資源管理器管理和協(xié)調(diào)的事務(wù),可以跨越多個數(shù)據(jù)庫和進(jìn)程。資源管理器一般使用XA二階段提交協(xié)議與“企業(yè)信息系統(tǒng)”(EIS)或數(shù)據(jù)庫進(jìn)行交互。
本地事務(wù):在單個EIS或數(shù)據(jù)庫的本地并且限制在單個進(jìn)程內(nèi)的事務(wù)。本地事務(wù)不涉及多個數(shù)據(jù)來源。
總結(jié)
以上就是本文關(guān)于Hibernate中獲取Session的兩種方式代碼示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱:
hibernate通過session實現(xiàn)增刪改查操作實例解析
Hibernate使用hbm.xml配置映射關(guān)系解析
如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
詳解使用Spring?Data?repository進(jìn)行數(shù)據(jù)層的訪問問題
這篇文章主要介紹了使用Spring?Data?repository進(jìn)行數(shù)據(jù)層的訪問,抽象出Spring Data repository是因為在開發(fā)過程中,常常會為了實現(xiàn)不同持久化存儲的數(shù)據(jù)訪問層而寫大量的大同小異的代碼,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2022-06-06利用Java實體bean對象批量數(shù)據(jù)傳輸處理方案小結(jié)
javabean是對面向?qū)ο笏枷氲囊环N具體實施的表現(xiàn),本文重點給大家介紹利用Java實體bean對象批量數(shù)據(jù)傳輸處理方案小結(jié),本文通過兩種方案給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2021-05-05springboot3.2整合mybatis-plus詳細(xì)代碼示例
這篇文章主要給大家介紹了關(guān)于springboot3.2整合mybatis-plus的相關(guān)資料,Spring Boot是一個非常流行的Java Web框架,可以快速地搭建Web應(yīng)用程序,需要的朋友可以參考下2023-12-12Spring注解驅(qū)動之BeanPostProcessor后置處理器講解
這篇文章主要介紹了Spring注解驅(qū)動之BeanPostProcessor后置處理器講解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09