Hibernate中獲取Session的兩種方式代碼示例
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).用戶在對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作的過(guò)程需要將這一系列操作記錄,以便跟蹤數(shù)據(jù)庫(kù)的動(dòng)態(tài).那么一個(gè)用戶在向數(shù)據(jù)庫(kù)插入一條記錄的時(shí)候,就要向日志文件中記錄一條記錄,用戶的一系列操作都要在一個(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;
}
}
用戶業(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)類(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)源。
總結(jié)
以上就是本文關(guān)于Hibernate中獲取Session的兩種方式代碼示例的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱:
hibernate通過(guò)session實(shí)現(xiàn)增刪改查操作實(shí)例解析
Hibernate使用hbm.xml配置映射關(guān)系解析
如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
相關(guān)文章
Spring中@Controller和@RestController的區(qū)別詳解
這篇文章主要介紹了Spring中@Controller和@RestController的區(qū)別詳解,@RestController?是?@Controller?和?@ResponseBody?的結(jié)合體,單獨(dú)使用?@RestController?的效果與?@Controller?和?@ResponseBody?二者同時(shí)使用的效果相同,需要的朋友可以參考下2023-10-10
javafx實(shí)現(xiàn)圖片3D翻轉(zhuǎn)效果方法實(shí)例
程序?qū)崿F(xiàn)思路: 在javafx中Node對(duì)象有一個(gè)effect屬性,可以用于實(shí)現(xiàn)各種特效。PerspectiveTransform特效可以使Node對(duì)象實(shí)現(xiàn)透視變換。因此我們可以通過(guò)計(jì)算透視變換中每個(gè)點(diǎn)的位置來(lái)實(shí)現(xiàn)3D翻轉(zhuǎn)特效。2013-04-04
java+sqlserver實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要介紹了利用java和sqlserver實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),違章內(nèi)容主要建立了與sqlserver數(shù)據(jù)庫(kù)的連接開(kāi)始展開(kāi)內(nèi)容,能學(xué)到了解JDBC執(zhí)行SQL的語(yǔ)法,需要的朋友可以參考一下2021-12-12
Java實(shí)用小技能之快速創(chuàng)建List常用幾種方式
java集合可以說(shuō)無(wú)論是面試、刷題還是工作中都是非常常用的,下面這篇文章主要給大家介紹了關(guān)于Java實(shí)用小技能之快速創(chuàng)建List常用的幾種方式,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
詳解Java?POI?excel自定義設(shè)置單元格格式
這篇文章主要介紹了Java?POI?excel設(shè)置單元格格式,自定義設(shè)置,設(shè)置單元格格式:來(lái)源_formats,更多數(shù)據(jù)類(lèi)型從formats里面發(fā)現(xiàn),需要的朋友可以參考下2024-01-01
Unity&Springboot實(shí)現(xiàn)本地登陸驗(yàn)證
本文主要介紹了Unity&Springboot服務(wù)器/本地登陸驗(yàn)證,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07
Java利用Geotools從DEM數(shù)據(jù)中讀取指定位置的高程信息全過(guò)程
Geotools作為一款功能強(qiáng)大且開(kāi)源的地理工具庫(kù),為地理數(shù)據(jù)的處理和分析提供了豐富的類(lèi)庫(kù)和便捷的接口,能夠很好地滿足從DEM數(shù)據(jù)中讀取高程信息這一實(shí)戰(zhàn)需求,本文將深入講解如何利用Geotools從獲取DEM數(shù)據(jù)到成功讀取指定位置高程信息的全過(guò)程,需要的朋友可以參考下2025-03-03
在controller中如何設(shè)置接收參數(shù)的默認(rèn)值
這篇文章主要介紹了在controller中如何設(shè)置接收參數(shù)的默認(rèn)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

