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