我正試圖在Spring + JPA + Hibernate環境中處理唯一鍵約束違規。將PersistenceException轉換爲Spring中的DataAccessException
我使用PersistenceExceptionTranslationPostProcessor
將PersistenceException
翻譯爲DataAccessException
。如果存在唯一的密鑰約束違規行爲,我認爲會引發DuplicateKeyException
或DataIntegrityViolationException
,但我得到的結果是JpaSystemException
,其中包含PersistenceException
。
是不是使用DataAccessException
層次結構的整個觀點,它足夠精細,不必查找供應商特定的錯誤代碼?
如何讓Spring將PersistenceException
翻譯爲更具體的DataAccessException
?
編輯:我注意到DataAccessUtils.translateIfNecessary()中this.jpaDialect爲null。我需要配置一些設置來將this.jpaDialect設置爲HibernateJpaDialect嗎?
謝謝!
您是否嘗試過使用@Repository註釋來覆蓋DAO類?如果是這樣,不使用時會拋出什麼異常? – 2011-02-25 19:33:47
@Tomasz是的,Spring並沒有翻譯PersistenceException,而是轉化爲一個JpaSystemException,它不夠具體。如果沒有翻譯,則會拋出PersistenceException。 – 2011-02-25 19:59:02
您可以嘗試在'org.springframework.orm.jpa.vendor.HibernateJpaDialect#translateExceptionIfPossible'方法中添加斷點來了解Spring如何在後臺翻譯JDBC/JPA/Hibernate異常?看看你的完整堆棧跟蹤是什麼樣子,特別是哪些異常是被包裝的,這也很棒。 – 2011-02-25 20:21:50