欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Hibernate中获取Session的两种方式代码示例

程序员文章站 2024-02-22 12:07:52
session:是应用程序与数据库之间的一个会话,是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的两种方式代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅:

快速了解hibernate中的session

hibernate使用hbm.xml配置映射关系解析

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!