欧美三级电影完整|亚洲一二三四久久|性爱视频精品一区二区免费在线观看|国产精品啪啪视频|婷婷六月综合操人妻视频网站|99爱免费视频在线观看|美女一级片在线观看|北京熟女88av|免费看黄色A级电影|欧美黄色毛片儿

Hibernate 事務(wù)與JDBC 事務(wù)同時(shí)使用注意事項(xiàng)

2023-04-12



當(dāng)一個(gè)service ,既調(diào)用了用Hibernate技術(shù)實(shí)現(xiàn)的DAO,又調(diào)用了用JDBC技術(shù)實(shí)現(xiàn)的DAO時(shí),service需要怎樣配置事務(wù)?當(dāng)一個(gè)service 調(diào)用了其他service,而兩個(gè)service所配置的事務(wù)不同,我們應(yīng)該怎么處理?


本文通過(guò)4個(gè)測(cè)試,描述了在配置JDBC事務(wù)和Hibernate事務(wù)混用的情況下,應(yīng)該注意的事情。寫(xiě)的不好,請(qǐng)大家多多幫助。
我們先進(jìn)行一個(gè)測(cè)試,測(cè)試結(jié)果如下:

1. service 配置baseTxProxy(HibernateTransactionManager) Hibernate和JDBC實(shí)現(xiàn)的DAO沒(méi)有配置事務(wù)(沒(méi)有出現(xiàn)異常)。

2.service配置JDBCTxDAOProxy (DataSourceTransactionManager) Hibernate和JDBC實(shí)現(xiàn)的DAO沒(méi)有配置事務(wù)(沒(méi)有出現(xiàn)異常)。

3.service配置baseTxProxy(HibernateTransactionManager)Hibernate和JDBC實(shí)現(xiàn)的DAO配置了對(duì)應(yīng)實(shí)現(xiàn)的事務(wù)(沒(méi)有異常)。


4.service配置JDBCTxDAOProxy (DataSourceTransactionManager) Hibernate和JDBC實(shí)現(xiàn)的DAO配置了對(duì)應(yīng)實(shí)現(xiàn)的事務(wù)(拋出異常)
下面對(duì)這個(gè)測(cè)試進(jìn)行進(jìn)一步的說(shuō)明:

1. service 配置baseTxProxy(HibernateTransactionManager) Hibernate和JDBC實(shí)現(xiàn)的DAO 沒(méi)有配置事務(wù):
正常:

查詢功能正常,修改、刪除功能正常。系統(tǒng)不拋出異常。
問(wèn)題:

當(dāng)Hinernat實(shí)現(xiàn)的DAO調(diào)用save方法添加一條記錄時(shí),用JDBC實(shí)現(xiàn)的DAO讀取不到數(shù)據(jù)。








1. System.out.println("hibernate delete");  
2. zxmTestHiDAO.deleteDB();  
3. System.out.println("hibernate insert");  
4. zxmTestHiDAO.saveDB();  
5. System.out.println("hibernate read");  
6. zxmTestHiDAO.readDB();





問(wèn)題原因及解決辦法:

當(dāng)調(diào)用Hibernate的save方法時(shí),Hibernat并沒(méi)有提交數(shù)據(jù),而是放入Hibernaet緩存中,在提交事務(wù)前,一起提交數(shù)據(jù),這時(shí),JDBC讀取數(shù)據(jù)庫(kù),是得不到數(shù)據(jù)的,及時(shí)他們是配置在一個(gè)事務(wù)中的。

為了讓JDBC能能夠讀取到Hibernate添加的數(shù)據(jù),我們需要調(diào)用Hibernate提供的flush方法。這樣,JDBC就能夠讀取到了。

當(dāng)Hibernate調(diào)用delete和update時(shí),會(huì)自動(dòng)調(diào)用flush方法。

2. service 配置JDBCTxDAOProxy (DataSourceTransactionManager) Hibernate和JDBC實(shí)現(xiàn)的DAO 沒(méi)有配置事務(wù):
正常:

查詢、JDBC調(diào)用正常。系統(tǒng)不拋出異常。
問(wèn)題:

hibernate不能提交事務(wù)。
問(wèn)題原因及解決辦法:

沒(méi)有好的解決辦法,不建議這么配置。

3.service 配置baseTxProxy(HibernateTransactionManager) Hibernate和JDBC實(shí)現(xiàn)的DAO 配置了對(duì)應(yīng)實(shí)現(xiàn)的事務(wù):
測(cè)試結(jié)果與測(cè)試1相同。

4.service 配置JDBCTxDAOProxy (DataSourceTransactionManager) Hibernate和JDBC實(shí)現(xiàn)的DAO 配置了對(duì)應(yīng)實(shí)現(xiàn)的事務(wù):
問(wèn)題:

系統(tǒng)拋出如下異常,說(shuō)明配置錯(cuò)誤,不能這樣使用。

Pre-bound JDBC connection found - HibernateTransactionManager does not support running within DataSourceTransactionManager if told to manage the DataSource itself. It is recommended to use a single HibernateTransactionManager for all transactions on a single DataSource, no matter whether Hibernate or JDBC access.
結(jié)論:

根據(jù)以上測(cè)試結(jié)果,建議使用第1、3種方法。

使用時(shí),要特別注意Hinernate 添加了數(shù)據(jù),JDBC要讀取這個(gè)數(shù)據(jù)時(shí),要調(diào)用Hibernate 的flush方法。


本文僅代表作者觀點(diǎn),版權(quán)歸原創(chuàng)者所有,如需轉(zhuǎn)載請(qǐng)?jiān)谖闹凶⒚鱽?lái)源及作者名字。

免責(zé)聲明:本文系轉(zhuǎn)載編輯文章,僅作分享之用。如分享內(nèi)容、圖片侵犯到您的版權(quán)或非授權(quán)發(fā)布,請(qǐng)及時(shí)與我們聯(lián)系進(jìn)行審核處理或刪除,您可以發(fā)送材料至郵箱:service@tojoy.com