2011-02-25 51 views
6

我正試圖在Spring + JPA + Hibernate環境中處理唯一鍵約束違規。將PersistenceException轉換爲Spring中的DataAccessException

我使用PersistenceExceptionTranslationPostProcessorPersistenceException翻譯爲DataAccessException。如果存在唯一的密鑰約束違規行爲,我認爲會引發DuplicateKeyExceptionDataIntegrityViolationException,但我得到的結果是JpaSystemException,其中包含PersistenceException

是不是使用DataAccessException層次結構的整個觀點,它足夠精細,不必查找供應商特定的錯誤代碼?

如何讓Spring將PersistenceException翻譯爲更具體的DataAccessException

編輯:我注意到DataAccessUtils.translateIfNecessary()中this.jpaDialect爲null。我需要配置一些設置來將this.jpaDialect設置爲HibernateJpaDialect嗎?

謝謝!

+0

您是否嘗試過使用@Repository註釋來覆蓋DAO類?如果是這樣,不使用時會拋出什麼異常? – 2011-02-25 19:33:47

+0

@Tomasz是的,Spring並沒有翻譯PersistenceException,而是轉化爲一個JpaSystemException,它不夠具體。如果沒有翻譯,則會拋出PersistenceException。 – 2011-02-25 19:59:02

+0

您可以嘗試在'org.springframework.orm.jpa.vendor.HibernateJpaDialect#translateExceptionIfPossible'方法中添加斷點來了解Spring如何在後臺翻譯JDBC/JPA/Hibernate異常?看看你的完整堆棧跟蹤是什麼樣子,特別是哪些異常是被包裝的,這也很棒。 – 2011-02-25 20:21:50

回答

9

顯然你沒有jpaDialect設置。對於休眠應該看起來像這樣:

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
    <!-- ... --> 
</bean> 
+0

工作就像一個魅力。非常感謝您的參與。 – 2011-02-25 22:19:49

+0

我的榮幸:-)。 – 2011-02-25 22:25:34

+1

好孩子!保存了我的一天。 +1 – 2011-11-30 08:00:11

相關問題