您好,登錄后才能下訂單哦!
這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)使用Hibernate怎么對(duì)Session進(jìn)行獲取,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
Session:是應(yīng)用程序與數(shù)據(jù)庫(kù)之間的一個(gè)會(huì)話,是Hibernate運(yùn)作的中心,持久層操作的基礎(chǔ).對(duì)象的生命周期/事務(wù)的管理/數(shù)據(jù)庫(kù)的存取都與Session息息相關(guān).
Session對(duì)象是通過(guò)SessionFactory構(gòu)建的,下面舉個(gè)例子來(lái)介紹Hibernate兩種獲取session的方式。
日志,是編程中很常見(jiàn)的一個(gè)關(guān)注點(diǎn).用戶(hù)在對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的過(guò)程需要將這一系列操作記錄,以便跟蹤數(shù)據(jù)庫(kù)的動(dòng)態(tài).那么一個(gè)用戶(hù)在向數(shù)據(jù)庫(kù)插入一條記錄的時(shí)候,就要向日志文件中記錄一條記錄,用戶(hù)的一系列操作都要在一個(gè)Session中進(jìn)行,否則這就成為了兩個(gè)線程.不能保證同步.看下面的代碼
HibernateUtil管理Session的工具類(lèi)
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(); } } //獲得開(kāi)啟著的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; } }
用戶(hù)業(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 { /** * 添加用戶(hù)和添加日志都使用了同一個(gè)Session,所以 * 當(dāng)用戶(hù)添加失敗的時(shí)候,日志也會(huì)添加失敗。事務(wù)回滾 * 用戶(hù)添加成功日志也會(huì)添加成功 */ public void addUser(User user) { Session session=null; try{ //取得當(dāng)前線程Session session=HibernateUtils.getSessionFactory().getCurrentSession(); session.beginTransaction(); //保存用戶(hù) 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)類(lèi):
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); } }
測(cè)試類(lèi)
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沒(méi)有和當(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ù)庫(kù)和進(jìn)程。資源管理器一般使用XA二階段提交協(xié)議與“企業(yè)信息系統(tǒng)”(EIS)或數(shù)據(jù)庫(kù)進(jìn)行交互。
本地事務(wù):在單個(gè)EIS或數(shù)據(jù)庫(kù)的本地并且限制在單個(gè)進(jìn)程內(nèi)的事務(wù)。本地事務(wù)不涉及多個(gè)數(shù)據(jù)來(lái)源。
上述就是小編為大家分享的使用Hibernate怎么對(duì)Session進(jìn)行獲取了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。