JPA事务和hibernate混合事务研究

混合事务用起来确实是比较麻烦的事情,我也百度了下,基本上只看见了关于jdbc事务和jpa事务(hibernate事务)混合事务的介绍,以及用法,
但是就是没有看到jpa事务和hibernate混合事务的用法说明的博客或者文章。
关于JPA和hibernate我就不详细介绍了,理论上来说JPA是规范,hibernate是其实现,混合起来使用应该没有那么麻烦,但是混合起来是个什么样的效果呢。
这个还得研究,下面跟我一起来以代码为主进行分析研究。
首先,得分两种大类型的情况,如下:
1.在hibernate事务中加入jpa事务的service
2.在jpa事务中加入hibernate事务的service
首先分析第二种情况吧,在JPA事务中嵌套hibernate事务,这种情况也分为了两种类型:
1.hibernate事务的配置就直接使用jpa的事物管理器
配置了JPA的事物管理器

JPA的事物使用注解配置


接下来配置hibernate的事物,我用的是AOP的方式配置的hibernate的事物,直接引用JPA的事物管理器


编写hibernate事物的service

@Service("wfClientService")
public class WfClientServiceImpl implements IWfClientService {
    @Override
    public void saveRolePart(RolePart rolePart) throws BizProcessException {
        rolePartDao.saveRolePart(rolePart);
	//这里抛出异常,看是否可以正常回滚
        throw new BizProcessException("测试事物回滚");
    }
}

然后编写JPA事物的service

@Service
@Transactional(value="transactionManager", rollbackFor=java.lang.Exception.class)
public class MessageSelectedServiceImpl extends BaseServiceImpl<MessageSelected> implements IMessageSelectedService {
	//测试jpa和hibernate混合事务
	@Override
	public void testMixTransation() throws BizProcessException {
		RolePart rolePart = new RolePart();
		rolePart.setRoleId("hhh" + new Random().nextInt(1000));
		rolePart.setPartId("ccc" + new Random().nextInt(1000));
		//这里调用hibernate的AOP配置的事物的service方法
		wfClientService.saveRolePart(rolePart);
	}
	
}
事物配置好了,service代码也写好了,然后启动服务,看下能否回滚,还是直接启动就报错了呢?


可以看到,tomcat正常启动是没有问题的,接下来,调用下服务,看会出现什么问题?



异常正常抛出,事物也正常回滚,查看数据库,记录也没有保存进去,这种情况很nice哦,注释掉异常,看记录能否保存进去?


后台没有异常,数据也可以正常保存成功,说明这种配置是OK的,当然没有经过大量测试,仅限本次研究中。有兴趣的网友可以多做点测试哦。

今天就到这里吧,要下班了。剩下的几种情况到后面均会放出。后期还会研究下原代码,好做下分析。

发布了256 篇原创文章 · 获赞 37 · 访问量 35万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章