2014-01-15 200 views
0

With @Transaction和Spring的跟蹤級別日誌記錄我發現Hibernate在db約束上有一個異常,但它只是回退事務。我嘗試使用@Exception沒有成功,試圖抓住它。Spring Hibernate吃異常

我在網上看到一個建議,使用Spring AOP @AfterThrowing來捕捉這樣的事件。

這似乎是一個處理普通事件的相當複雜的方式。 try/catch和老式的提交/回滾似乎更容易。 Spring Hibernate中沒有更好的方法 ?

我正在處理隊列中的XML消息。根據我得到的異常的類型,我可能只想捕獲它,並將壞的傳入隊列消息放入數據庫錯誤表中並繼續事務。 (如果我只是盲目地回滾消息,將會放回隊列,這在某些情況下可能是好的,但在其他情況下不會)。

從我讀過的有些方法知道一些錯誤(出於某種原因不是約束錯誤)並記錄它們。在發生異常之後是否有辦法中斷事務並決定是否要提交,繼續或回滾?

如果沒有,可以使用舊式提交併使用spring hibernate進行回滾嗎?

+0

這不是吃它處理它的例外。吃東西會很有吸引力,不會回滾。 –

+0

通過吃飯我的意思是在處理後不會拋出另一個異常。它應該拋出一個Hibernate運行時異常(Exception的子類),但是當我使用@Exception時,什麼都不會被捕獲。我想知道異常,並根據其類型更改處理。 – user1069528

+0

他們似乎已經去了一個通知模型。我個人不會對「有例外,所以我回滾」感到不舒服。現在,這些溢出的牛奶已經在地毯下掃過了。 –

回答

1

配置SimpleMappingException解析器和記錄異常有:

public class MyExceptionResolver extends SimpleMappingExceptionResolver { 
private Logger logger = LoggerFactory.getLogger(MyExceptionResolver .class); 

@Override 
protected void logException(Exception ex, HttpServletRequest request) { 
    this.logger.warn(buildLogMessage(ex, request), ex); 
} 

<bean class="com.mypackage.MyExceptionResolver"/> 

編輯:

你可以選擇做任何事情。上述課程與回滾無關。攔截異常並根據需要做任何事情都很有用。 默認情況下,Spring會回滾任何RuntimeException。 如果要配置回滾政策:

@Transactional(rollbackFor = { CustomException.class}) 

@Transactional(noRollBackFor= { CustomException.class}) 
+0

謝謝,但我也想決定提交還是回滾;不只是記錄異常。 – user1069528

+0

我編輯了我的答案,看看。 – isah

+0

謝謝,應該這樣做。 – user1069528