SpringDao異常

Spring的DAO框架沒有拋出與特定技術相關的異常
例如SQLException或HibernateException,拋出的異常都是與特定技術無關的org.springframework.dao.DataAccessException類的子類,避免系統與某種特殊的持久層實現耦合在一起。DataAccessException是RuntimeException,是一個無須檢測的異常,不要求代碼去處理這類異常,遵循了Spring的一般理念(異常檢測會使代碼到處是不相關的catch或throws語句,使代碼雜亂無章),並且NestedRuntimeException的子類,是可以通過NestedRuntimeException的getCause()方法獲得導致該異常的另一個異常。

DataAccessException的子類異常有:
1)CleanupFailureDataAccessException 一項操作成功地執行,但在釋放數據庫資源時發生異常(例如,關閉一個Connection)
2)DataAccessResourceFailureException 數據訪問資源徹底失敗,例如不能連接數據庫
3)DataIntegrityViolationException Insert或Update數據時違反了完整性,例如違反了惟一性限制
4)DataRetrievalFailureException 某些數據不能被檢測到,例如不能通過關鍵字找到一條記錄
5)DeadlockLoserDataAccessException 當前的操作因爲死鎖而失敗
6)IncorrectUpdateSemanticsDataAccessException Update時發生某些沒有預料到的情況,例如更改超過預期的記錄數。當這個異常被拋出時,執行着的事務不會被回滾
7)InvalidDataAccessApiUsageException 一個數據訪問的JAVA API沒有正確使用,例如必須在執行前編譯好的查詢編譯失敗了
8)InvalidDataAccessResourceUsageException 錯誤使用數據訪問資源,例如用錯誤的SQL語法訪問關係型數據庫
9)OptimisticLockingFailureException 樂觀鎖的失敗。這將由ORM工具或用戶的DAO實現拋出
10)TypemismatchDataAccessException Java類型和數據類型不匹配,例如試圖把String類型插入到數據庫的數值型字段中
11)UncategorizedDataAccessException 有錯誤發生,但無法歸類到某一更爲具體的異常中

遇到的坑
1)利用數據庫的唯一索引做約束
使用mybatis框架,日誌中打印出的異常爲:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException,但spring在dao層做了統一的異常處理,實際需要捕獲的異常被轉化成了:org.springframework.dao.DuplicateKeyException

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章