spring+hibernate使用手动事务-session与当前线程绑定

在非Web项目中,使用Hibernate进行定时任务时遇到事务未生效的问题。通过研究发现,需要将Session与当前线程绑定。本文介绍了两种方法:1) 使用HibernateTransactionManager和TransactionStatus,注意在循环提交时需在循环内处理;2) 利用TransactionSynchronizationManager绑定Session。同时提醒,使用SessionUtils和TestDao时,需要在DAO层自定义方法,并且不要直接调用session.close,避免影响其他操作。
摘要由CSDN通过智能技术生成

spring+hibernate使用手动事务-session与当前线程绑定

前言

在做一个定时执行job的时候(非web项目),发现配置的事务没有起作用,大佬指点说是因为session没有与当前线程绑定。似懂非懂,查了好多资料,自己又一点一点测试,发现以下两种方法。仅供参考,可能有不对的地方,欢迎大佬们指正。

HibernateTransactionManager

第一种方法就是使用HibernateTransactionManager、TransactionStatus解决

		HibernateTransactionManager transactionManager = null;
		TransactionStatus status = null;
		// 开启手动事务
		transactionManager = (HibernateTransactionManager) ApplicationLoader.getContext().getBean("transactionManager");
		DefaultTransactionDefinition def = new DefaultTransactionDefinition();
		// 事物隔离级别,开启新事务,这样会比较安全些。
		def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
		for(int j = 0; j <= 10; j++) {
   
			// 获得事务状态
			status = transactionManager.getTransaction(def);
			Session s = transactionManager.getSessionFactory().getCurrentSession();
			// 此处b是true
			boolean b = s.isOpen(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值