2011-08-26 79 views
0

我對我的Spring + Hibernate + Struts應用程序使用了PROPAGATION_REQUIRED聲明式事務管理方法。 我可以在撥打服務電話的地方(交易開始的地方)趕上StaleObjectException(打算)。在執行更新的服務方法中嵌套調用Foo1,Foo2,Foo3。我想在這些方法中發現異常。我該怎麼做?任何替代方案或解決方法?在Spring聲明式事務管理中處理Hibernate異常

回答

4

你不應該抓住這個例外。從Hibernate reference documentation

如果Session拋出異常,包括任何的SQLException, 立即回滾數據庫事務,調用Session.close() ,丟棄該Session實例。會話的某些方法不會 使會話保持一致狀態。 沒有拋出異常Hibernate可以被視爲可恢復。

這意味着除了捕捉異常以轉換它或將其包裝爲另一種異常之外,捕捉該異常並不會幫助您:使用會話之後無法按預期工作。

有關討論樂觀鎖定異常處理的另一個問題,請參閱How to deal with locks (JPA)?

+0

嗯,我同意你的看法。但我想重試一部分交易。你認爲這不是一個好主意嗎?我應該重複整個過程嗎? [這可能會影響用戶看到的性能] –

+0

你不能。如果你想重試(在大多數情況下這是一個壞主意,特別是如果它是一個涉及最終用戶的用例),你必須回滾事務並重新啓動一個新的Hibernate會話。 –

+0

好吧。謝謝。我想我必須這樣做。 –