中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Hibernate怎么對Session進行獲取

發布時間:2021-01-28 10:44:31 來源:億速云 閱讀:290 作者:Leah 欄目:編程語言

這期內容當中小編將會給大家帶來有關使用Hibernate怎么對Session進行獲取,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

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進行獲取了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹿泉市| 满城县| 安龙县| 五河县| 井陉县| 班玛县| 江山市| 黄大仙区| 温泉县| 光泽县| 霍山县| 梁河县| 中牟县| 洛南县| 滕州市| 宜丰县| 会宁县| 黄石市| 集贤县| 雷波县| 共和县| 定州市| 伊金霍洛旗| 广南县| 宝山区| 水城县| 民勤县| 哈巴河县| 陆河县| 车致| 玉树县| 隆安县| 合肥市| 灵石县| 洪雅县| 彰武县| 景泰县| 卫辉市| 新乐市| 万山特区| 绥棱县|