hibernate的事务管理和session对象的详解

		//开启事务
		transaction=session.beginTransaction();

 上面为开启事务

transaction.commit();这个为提交事务

从session对象中获取事务后进行提交

 

 

下面可以自动提交事务,并且可以不需要对于这个事务进行提交,但是不推荐这样进行使用这个方法

		session.doWork(new Work() {
			//这里的connection对象就是jdbc中的对象
			@Override
			public void execute(Connection connection) throws SQLException {
				// TODO Auto-generated method stub
				connection.setAutoCommit(true);//设置自动提交事务
			}
		});

 在设置自动提交事务后必须对session进行刷新操作后才能有效

	session.flush();//对于事务设成自动提交后需要对session进行刷新后才能使用

 openSession 每次使用都是打开一个新的session,使用完需要调用close方法关闭session;如果不关闭会导致每次都打开一个connection对象,最后导致连接池溢出

 


getCurrentSession 是获取当前session对象,连续使用多次时,得到的session都是同一个对象,这就是与openSession的区别之一 ;
一般在实际开发中,往往使用getCurrentSession多,因为一般是处理同一个事务,所以在一般情况下比较少使用openSession;
如何获得session对象???
(1)openSessionion
(2)getCurrentSession
如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:
如果是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
如果是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>

package cn.lonecloud.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
import org.junit.Test;

public class SessionTest {

	@Test
	public void TestOpenSession() {
		Configuration configuration = new Configuration().configure();// 获得配置文件对象
		ServiceRegistry registry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
				.buildServiceRegistry();//获得服务注册对象
		SessionFactory factory=configuration.buildSessionFactory(registry);//获得session工厂对象
		Session session=factory.openSession();//获取session对象
		if (session!=null) {
			System.out.println("Session 创建成功");
		}else {
			System.out.println("Session 创建失败");
		}

	}
	//在使用getCurrentSession的时候必须在cfg配置文件中进行配置
	// 		<!--设置当前的session对象的类型thead为当前的jdbc的session对象 -->
//	<!-- 如果是本地事务(jdbc事务) -->
//	<property name="hibernate.current_session_context_class">thread</property>
//<!-- 		如果是全局事务(jta事务)
//	<property name="hibernate.current_session_context_class">jta</property> -->
	@Test
	public void TestCurrentSession(){
		Configuration configuration = new Configuration().configure();// 获得配置文件对象
		ServiceRegistry registry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
				.buildServiceRegistry();//获得服务注册对象
		SessionFactory factory=configuration.buildSessionFactory(registry);//获得session工厂对象
		Session session=factory.getCurrentSession();//获取session对象
		if (session!=null) {
			System.out.println("Session 创建成功");
		}else {
			System.out.println("Session 创建失败");
		}
	}
}

 

posted @ 2016-07-28 14:41  lonecloud  阅读(5328)  评论(0编辑  收藏  举报
我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:lonecloud,邀请大家一同入驻:https://www.oschina.net/sharing-plan/apply