您的位置:首页 > 其它

JPA事务和hibernate混合事务研究<一>

2016-11-03 17:28 288 查看
混合事务用起来确实是比较麻烦的事情,我也百度了下,基本上只看见了关于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的,当然没有经过大量测试,仅限本次研究中。有兴趣的网友可以多做点测试哦。

今天就到这里吧,要下班了。剩下的几种情况到后面均会放出。后期还会研究下原代码,好做下分析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息