2012-08-24 82 views
1

我在我的應用程序中使用Spring Hibernate集成,並且DAO類正在擴展HibernateDaoSupport
假設我使用代碼保存了一些對象 getHibernateTemplate().save(object); 由於Spring Hibernate集成不要求寫入try-catch塊,但假設在保存該對象時遇到任何異常。 那麼處理它的最好方法是什麼?我的意思是我應該在服務層捕獲它並將其包裝在一些用戶定義的特徵中。 我是否需要在DAO層方法本身中編寫try-catch以防我想記錄DAO中的哪個方法拋出異常?使用HibernateDaoSupport處理異常

我從來沒有用過HibernateDaoSupport或Hibernate模板,所以對於異常處理一無所知。請提供您的寶貴意見

回答

2

春季使用RuntimeException背後的想法是,通常有不同類型的異常:您想從(如DuplicateKeyException恢復

  • 例外,如果一個記錄你」重新嘗試已經插入存在,或者更一般的DataIntegrityViolationException如果有這是侵犯用戶輸入的結果)
  • 例外,你不能從恢復DB約束(數據庫關閉)

對於第一種情況,您可以很好地處理例外情況(通過自定義業務例外,以便視圖圖層可以重定向到輸入頁面並提供有意義的消息)

對於第二種情況,更容易讓異常冒泡並讓它通過一個通用的異常處理程序處理,然後向用戶顯示一個通用的錯誤頁面。對於這種情況,將異常封裝在自定義異常中是沒有意義的,因爲您將無法恢復。吹起來的數據庫往往是致命的。

所以我會做什麼:

try { 
    getHibernateTemplate().save(object); 
} catch (DataIntegrityViolationException dive) { 
    throw new BusinessValidationException(dive, "You've got the data wrong"); 
} 
0

春季異常層次結構是well documented.

通常你不能做多,如果你有一個數據訪問異常,因爲在工作系統中,這可能會引起由於數據庫服務器上的磁盤空間不足,或者網絡連接問題等。 這種異常通常需要儘快記錄和調查。

有一些可恢復的錯誤,它們可以用spring異常層次結構來處理,但是imho大多數應該在開發階段避免,所以你的web服務器在進入db之前應該儘可能多地驗證它們。

如果你想設置的異常記錄看到了類似的問題: