2011-03-21 57 views
6

我正在使用Spring 3和Hibernate 3.6開發Web應用程序。我對@Transactional註釋和代碼結構有一些疑問。Hibernate,Spring,@Transactional - 用try/catch包圍?

- >當我使用@Transactional(使用Spring進行事務管理)時,是否必須在調用它們時使用try/catch包含@Transactional -annotated方法?

例如,當我得到一個方法加載,更改並返回一個對象,然後我從另一個類中調用它:是否必須用try/catch來包圍調用?也許出了什麼問題,沒有對象返回,數據庫連接失敗..我不知道。

到現在爲止,我認爲@Transactional關心所有可能發生的異常,並在發生錯誤時回滾此事務中的每個操作。 但如果它發生,我必須以某種方式通知用戶。當我調用try-block中的transactional-method並且它被回滾時,catch塊被激活? 我可以告訴用戶「出錯了」。否則用戶可能不會被通知?或者是否足以檢查是否有返回的對象(if/else),那麼我不需要try/catch? 林新,我想聽聽其他結構如何代碼。謝謝:-)

回答

4

Handling exceptions在Spring中使用HandlerExceptionResolvers和@ExceptionHandlers確實很容易。我傾向於專門使用@ExceptionHandler。

您可以使用@ExceptionHandler來處理特定異常,而不是自己在try-catch塊中處理它。

如果用戶想未找到的資源,你要發送404

@ExceptionHandler(NotFoundException.class) 
@ResponseStatus(HttpStatus.NOT_FOUND) 
public void handleNotFoundException(NotFoundException exc) { 
    // log something. 
} 

如果有一個服務器問題,即你要發送500

@ExceptionHandler(SomeException.class) 
public void handleException(SomeException exc, WebRequest request, HttpServletResponse response) { 
    response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Sorry dude, my server broke"); 
} 

你也應該狹隘地處理例外。一般來說,你不應該做@ExceptionHandler(Exception.class),我也相信它是按順序工作的,所以如果你處理一般異常,它應該是這個類中的最後一個方法。

+0

你是否認真對待代碼示例?例外永遠不應該被吞噬像那樣。沒有機會檢測到異常並回滾事務,我希望你的意思是這樣的:'catch(SomeException exc){throw new IllegalStateException(exc);}' – 2011-03-21 14:39:29

+0

@Sean這只是僞代碼,我希望他會除非,否則不會吞嚥異常他有充分的理由這樣做。 – 2011-03-21 14:43:57

+0

這就是爲什麼我問,而不是downvoting。你應該清楚這樣的東西,有很多新手 – 2011-03-21 14:50:46

1

Spring使用的主要特徵是Exception Translation

依賴異常轉換來生成異常,如果可能的話,客戶層理解並使用try/catch。

0

謝謝你的回答。我通過鏈接(spring文檔)閱讀,發現以下內容:

「但是,DAO拋出純HibernateException(未選中,因此不必聲明或捕獲),這意味着調用者只能處理異常通常是致命的 - 除非他們想依賴於Hibernate自己的異常層次 如果沒有將調用者綁定到實現策略上,捕獲特定的原因(例如樂觀鎖定失敗)是不可能的,這種權衡可能是強烈Hibernate基於和/或不需要任何特殊的異常處理。「

我的DAO基於Plain Hibernate 3 API,所以如果我理解它正確,我的DAO只會拋出純粹的HibernateExceptions。他們沒有被檢查,不必被宣佈或被捕。 如果出現問題,使用@Transactional將整個操作回滾。

爲了確保一切正常,因爲我期望它能夠正常工作,所以我必須將我的DAO更接近我的應用程序代碼。在那裏我可以檢查是否有物品被退回。 (如果爲空 - 否則) 我也可以捕獲異常,記錄它並通知用戶某些事情出錯了,而且他的事務不起作用。

因此,在這一點上,我仍然認爲,根據交易: 如果我可以處理結果,一切都可以 - 如果沒有,我可以通知用戶。

當事務沒有指定回退結果時,我可以使用try/catch來捕獲HibernateException。但是交易仍然回滾了嗎?我想,捕獲一個HibernateException避免了事務的回滾。 我仍然不知道該怎麼做。 :-(

除了這個不幸的是我不明白什麼MVC異常處理(@ExceptionHandler)必須處理這個。有一個處理異常的表,但我沒有找到HibernateException。 或者你認爲它會與這個工作:@ExceptionHandler(HibernateException.classs)?你也說你不會建議這樣處理異常。

相關問題