2014-02-23 69 views
2

我有以下類庫不拋出的異常。
當我使用@Transactional註釋從GarageFacade調用updateGarage時,garageRepository不會引發任何異常。
當我調用沒有@Transactional註釋的相同方法時,garageRepository拋出唯一違例異常,現在我可以使用BoozinaExceptions.getCodeException(garage, e)轉換異常;春數據JPA @Transactional時存在

發生此行爲是因爲當我有@Transactional批註時,Spring jpa數據執行提交時將引發異常。這發生在GarageBO.updateGarage執行好後?

但我需要轉換唯一違規。我怎樣才能做到這一點 ?
如何處理後提交彈簧異常,然後轉換爲我的異常?

+0

當車庫實體不存在,我嘗試保存它,catch塊被執行,我可以轉換異常。但是,當車庫實體已經存在時,catch塊不會執行,並且這條線出現在休眠日誌中:HHH000010:在批量發佈時它仍然包含JDBC語句 –

回答

4

你描述的是預期的行爲。事務在方法結束後被提交,提交導致違反唯一約束。

@Transactional添加到服務方法使事務在調用事務提交的服務方法後結束。刪除它會使事務在調用存儲庫方法後提交。

此外,爲什麼你有一個BO門面和存儲庫?基本上BO和Facade是相同的恕我直言。

解決您的問題,你有你的GarageRepository延長JpaRepository代替PagingAndSortingRepository並調用saveAndFlush方法,而不是save。這將執行sql(不提交事務)並觸發約束衝突異常。

另一種解決方案是在您的BO create和Aspect進行轉換的try/catch。每次你需要它時,都可以保存你的try/catch代碼。

+0

我有一個BO和Facabe,因爲一個外觀可以與多個BO實體。 例如:GarageFacade有一個GarageBO和MessageBO,因爲當我創建一個車庫時,我創建實體車庫併發送一個帶有MessageBO的電子郵件。但我也可以創建一個沒有發送電子郵件的車庫,或者我可以發送電子郵件,而無需創建車庫。 –

+0

謝謝你,它完美的作品 –