溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

使用Hibernate怎么對(duì)Session進(jìn)行獲取

發(fā)布時(shí)間:2021-01-28 10:44:31 來(lái)源:億速云 閱讀:280 作者:Leah 欄目:編程語(yǔ)言

這期內(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è)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI