国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

Hibernate中獲取Session的兩種方式代碼示例

2024-07-13 10:14:28
字體:
來源:轉載
供稿:網友

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的兩種方式代碼示例的全部內容,希望對大家有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 和政县| 舟山市| 什邡市| 定陶县| 东丰县| 筠连县| 定南县| 平谷区| 盐城市| 福鼎市| 新干县| 汤原县| 池州市| 琼海市| 郸城县| 永年县| 满城县| 丹江口市| 吉首市| 苏尼特右旗| 醴陵市| 永吉县| 营山县| 盖州市| 都江堰市| 扶绥县| 读书| 辰溪县| 宝山区| 鄯善县| 锡林浩特市| 儋州市| 浦江县| 新蔡县| 余江县| 抚远县| 鄂州市| 岢岚县| 凤山县| 达拉特旗| 镇坪县|