Hibernate中的事务控制

第一、前言
阅读本文章之前请先阅读:ORM框架之Hibernate基本入门配置
第二、要解决的问题
让Session对象符合使用原则。即一个线程只能有一个Session。本文将介绍Session和线程绑定的配置和使用细节。
第三、代码示例
首先,复用之前的代码,建一个测试类

package com.demo;
import org.hibernate.Session;
import com.demo.util.HibernateUtil;
/**
 * 测试类
 * @author shixiangcheng
 * 2020-07-04
 */
public class Test {
	public static void main(String[] args) {
		Session session1=HibernateUtil.openSession();
		Session session2=HibernateUtil.openSession();
		System.out.println(session1==session2);
	}
}

在一个线程里获取两次session,比对两个session是否相同。执行结果如下:
在这里插入图片描述
这是因为调用openSession()方法,每次都得到一个新的session对象。现在我们对HibernateUtil.java修改如下:

package com.demo.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
/**
 * Hibernate工具类
 * @author shixiangcheng
 * 2020-07-04
 */
public class HibernateUtil {
	private static SessionFactory factory;
	//线程局部变量
	private static ThreadLocal<Session> tl=new ThreadLocal<Session>();
	static {
		try {
			//1.解析主配置文件
			Configuration cfg=new Configuration();//它只是创建,并不能加载xml配置文件
			cfg.configure();//加载默认位置和名称的配置文件(默认位置:类的根路径.默认名称:hibernate.cfg.xml)
			//2.根据配置文件创建SessionFactory(线程安全,同步锁)
			//使用原则:一个应用应该只有一个SessionFactory,在应用加载时创建,应用卸载时销毁
			factory=cfg.buildSessionFactory();
		}catch(ExceptionInInitializerError e) {
			throw new ExceptionInInitializerError("初始化SessionFactory失败,请检查配置文件!");
		}
	}
	public static Session openSession() {
		Session s=tl.get();
		if(s==null) {
			tl.set(factory.openSession());
		}
		return tl.get();
	}
}

然后再执行上面的测试类,发现返回值是true。这是因为将session对象和线程绑定,同一个线程多次获取的是同一个session对象。
此外,也可以通过配置实现上面的效果,在hibernate.cfg.xml文件中增加一条配置

<!-- 把session和线程绑定,从而实现一个线程只有一个session -->
<property name="current_session_context_class">thread</property>

文件HibernateUtil.java增加方法

	/**
	 * 从当前线程获取session对象
	 * @return
	 */
	public static Session getCurrentSession() {
		//只有配置了把session和线程绑定之后,才能使用此方法
		return factory.getCurrentSession();
	}

再次修改测试类

		Session session1=HibernateUtil.getCurrentSession();
		Session session2=HibernateUtil.getCurrentSession();
		System.out.println(session1==session2);

运行得到结果:true
BTW:当把session和线程绑定之后,Hibernate就会在提交或回滚事务之后,自动帮我们关闭session

欢迎大家积极留言交流学习心得,点赞的人最美丽,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值