我讀了一些關於如何設置事務以將Spring和Hibernate連接在一起的事務。看起來推薦的方法是初始化服務層中的事務。
當然。事務的劃分應該在服務層級別上進行,而不是在DAO層級別:
- 工作的單位是服務,而不是你想要如果需要交易跨越多個DAO的DAO
- 。
我不喜歡的是,大多數的交易,因爲他們所需要的休眠正常工作,只存在。
您應該詳細說明這一部分,因爲事務不是Hibernate特有的。
當我真的需要一個調用多個服務方法的工作事務時,似乎我沒有選擇從作業中初始化事務。
如果要調用多個服務從作業層發起的事務中,與REQUIRED
語義(默認)交易申報您的服務和依賴於Spring事務傳播(適用,除非你需要一個遠程調用;在這種情況下,使用EJB)。
因此,將@OnTransactional註釋從DAO移動到服務似乎沒有任何區別。
它確實有所作爲,你需要從工作層時運行批不使事情變得不同發起交易的事實。
我熱烈推薦閱讀Chapter 9. Transaction management。
(......)我的主要問題來自於休眠。對不起,如果我不清楚。
沒問題。只是當問題模糊時,你經常會得到一個模糊的答案:)
從hibernate文檔:「數據庫事務從來不是可選的,這就是爲什麼開發人員將DAO方法交易到我的項目上的原因。
很抱歉,但上面的語句只是說「與數據庫通信具有發生內交易」,僅此而已,並決定從哪裏開始交易,在您的自由裁量權留給(通常是服務層)。如果您在DAO級別執行此操作,那麼MySuperService
調用DaoFoo
和DaoBar
和DaoBar
會失敗怎麼辦?在這種情況下,您可能想要回滾所有更改,而不僅僅是在DaoBar
中執行的更改。因此需要控制工作單元開始的交易。
恕我直言,開發者需要一些指導。
這是否意味着我的所有服務都應該是事務性的?即使我剛剛讀取數據,例如?
首先,我建議閱讀Non-transactional data access and the auto-commit mode(的Sessions and transactions小弟)澄清有關「只讀交易」事情。閱讀整個頁面是值得的,但讓我舉這個特定部分:
許多應用程序開發人員認爲他們 可以談論到數據庫的 交易之外。這顯然不是 可能; 沒有SQL語句可以發送 到數據庫以外的數據庫 事務。術語非事務性 數據訪問意味着沒有 明確的事務邊界,沒有 系統事務,並且數據訪問的行爲是 自動提交模式的行爲。這並不意味着沒有 物理數據庫事務涉及 。
一旦你完成上述鏈接,下一個建議的閱讀將是@Transactional read-only flag pitfalls。下面是相關的部分:
(...)底線是,當您使用基於ORM的框架 時, 只讀標誌是無用的,而在 中大多數情況下都會被忽略。但是,如果你 仍然堅持使用它,總是設置 傳播模式,以支撐物,如清單9所示 ,所以沒有交易 啓動:使用
清單9.只讀和SUPPORTS
傳播模式選擇 操作
@Transactional(readOnly = true, propagation=Propagation.SUPPORTS)
public TradeData getTrade(long tradeId) throws Exception {
return em.find(TradeData.class, tradeId);
}
更重要的是,只是避免做讀操作時,使用 @Transactional
註釋完全 ,如圖所示 清單10:
清單10.刪除@Transactional
標註爲選擇 操作
public TradeData getTrade(long tradeId) throws Exception {
return em.find(TradeData.class, tradeId);
}
很好的問題,我是要問它自己:) – willcodejavaforfood 2010-10-28 13:06:05
有問題幫助並不像喜歡幫助答案,但它仍然很好聽; o) – Damien 2010-10-28 15:16:51