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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章