簡體   English   中英

Hibernate,Spring,@ Transactional - 用try / catch包圍?

[英]Hibernate, Spring, @Transactional - surround with try/catch?

我正致力於使用Spring 3和Hibernate 3.6開發Web應用程序。 我對@Transactional Annotation和代碼結構有一些疑問。

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

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

到目前為止,我認為@Transactional關注所有可能發生的異常,並在發生錯誤時回滾此事務中的每個操作。 但如果它發生,我必須以某種方式通知用戶。 當我在try-block中調用transactional-method並回滾它時,catch塊被激活了? 我可以告訴用戶“出了問題”。 否則用戶可能不會被告知?

或者是否足以檢查是否有返回的對象(如果/ else),那么我不需要try / catch? 我是新的,我想聽聽其他結構如何編碼。 謝謝 :-)

使用HandlerExceptionResolvers和@ExceptionHandlers 處理 Spring中的異常非常容易。 我傾向於獨占使用@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) ,我也相信它按順序工作,所以如果你處理一般的Exception,它應該是類中的最后一個方法。

Spring使用的主要功能是異常翻譯

依賴異常轉換來生成客戶端層理解的異常,並且只在可能的情況下使用try / catch。

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

“但是,DAO拋出普通的HibernateException(未經檢查,因此不必聲明或捕獲),這意味着調用者只能將異常視為致命的 - 除非他們想要依賴Hibernate自己的異常層次結構。捕獲特定原因如果沒有將調用者與實現策略聯系起來,就不可能出現樂觀的鎖定失敗。對於基於Hibernate的強大和/或不需要任何特殊異常處理的應用程序,這種權衡可能是可以接受的。“

我的DAO基於Plain Hibernate 3 API,所以如果我理解它是正確的,我的DAO只會拋出簡單的HibernateExceptions。 它們是未經檢查的,不必聲明或捕獲。 如果出現問題,使用@Transactional可以回滾整個操作。

為了確保一切正常,因為我希望它能夠正常工作,我必須將DAO與我的應用程序代碼緊密聯系起來。 在那里,我可以檢查一個對象是否被給予回饋。 (如果為null - else)我也可以捕獲異常,記錄它並通知用戶確實出錯了並且他的事務不起作用。

所以在這一點上,我仍在思考,根據交易:如果我可以使用結果,一切都好 - 如果沒有,我可以通知用戶。

當沒有指定事務來返回結果時,我可以使用try / catch來捕獲HibernateException。 但是,交易仍然回滾嗎? 我認為,捕獲HibernateException可以避免回滾事務。 我還是不知道該怎么辦。 :-(

不幸的是,我不明白MVC異常處理(@ExceptionHandler)與此有什么關系。 有一個處理異常的表,但我沒有找到HibernateException。 或者您認為它適用於此:@ExceptionHandler(HibernateException.classs)? 你也說過你不建議以這種方式處理異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM