2014-04-27 73 views
13

我有這個Spring Data CrudRepository,它處理DB上的CRUD操作。Spring CrudRepository異常

@Repository 
public interface IUserRepository extends CrudRepository<User, String> { 

} 

User是我的數據庫的用戶表的實體。 CrudRepository增加即下面的操作到倉庫:

  • delete(String ID)
  • findOne(String ID)
  • save(User user)

正如documentation所述,刪除和查找操作的情況下拋出IllegalArgumentException給定的ID是null,而保存操作不會拋出任何異常。

問題是CrudRepository的javadoc沒有提及這些操作拋出的其他異常。例如,它並不告訴delete(String ID)操作會在數據庫中不存在所提供的ID的情況下拋出EmptyResultDataAccessException

save(User user)操作的javadoc中,如果插入一個破壞一個數據完整性約束(在唯一字段和外鍵上)的新用戶,則不清楚拋出了哪些異常。此外,它不會警告您是否正在編寫新的或存在的用戶:它只是創建一個新用戶或覆蓋如果存在(因此它是一個Insert + Update操作)。

在企業應用程序中,我應該能夠捕獲每個可引發的異常,一個操作可以拋出,我應該在操作的javadoc中閱讀。

你知道任何關於CrudRepository異常的明確文檔嗎?

謝謝

回答

22

春天已經內置例外轉換機制,使由JPA持久性提供拋出的所有異常轉換成Spring的DataAccessException - 與@Repository(或配置)註釋:所有的bean。

有四個主要的羣體 -

  • NonTransientDataAccessException - 這些都是在那裏,除非異常的原因被糾正的同重試操作將失敗的異常。因此,例如,如果您傳遞了非現有的ID,則它將失敗,除非ID存在於數據庫中。

  • RecoverableDataAccessException - 這些與前一個「相反」 - 可恢復的異常 - 在一些恢復步驟之後。 API文檔中的更多詳細信息

  • ScriptException - 嘗試處理格式不正確的腳本時與SQL相關的異常。

  • TransientDataAccessException - 當沒有任何明確的步驟可以恢復時,這些例外是例外的。當數據庫發生超時時,您將在幾秒鐘後重試。

這就是說,要找到所有異常的文檔的理想場所 - 是API本身 - 剛剛經歷的DataAccessException層次。

+0

感謝您提供所有例外的鏈接,並詳細解釋它們的含義。 –

+1

@vtor你是什麼意思的「內置的異常翻譯機制」。我很好奇爲什麼春季文檔沒有明確說明某些方法拋出這個DataAccessException,例如保存CrudRepository類的方法。 – fabrik