2011-10-08 54 views
0

我有一個基於Spring的JPA2應用與HSQLDB上的Hibernate提供程序。我試圖優雅地處理異常,但我發現我正在獲取休眠異常而不是JPA異常。例如:HSQLDB不會拋出正確類型的ConstraintViolationException與Spring JPA /休眠

import javax.validation.ConstraintViolationException; 
    ... 

    @Override 
    @Transactional 
    public Result<Document> save(Document document) { 
     try { 
      store.persist(document); 
      return new Success<Document>(document); 
     } 
     catch (EntityExistsException e) { 
      return new Errors<Document>(DocumentError.DOCUMENT_ALREADY_EXISTS); 
     } 
     catch (ConstraintViolationException e) { 
      return new Errors<Document>(DocumentError.CONSTRAINT_VOILATION); 
     } 
     catch (PersistenceException e) { 
      return new Errors<Document>(DocumentError.UNKOWN_EXCEPTION); 
     } 
    } 

而是被扔javax.validation.ConstraintViolationException的我抓的PersistenceException:

javax.persistence.PersistenceException:org.hibernate.exception.ConstraintViolationException:無法插入:[文件]

我在Spring配置中配置的JpaAdapter:

 <bean id="dataSource" 
       class="org.springframework.jdbc.datasource.DriverManagerDataSource" 
       p:driverClassName="org.hsqldb.jdbcDriver" 
       p:url="jdbc:hsqldb:file:target/db/intox" 
       p:username="sa" 
       p:password="" 
       /> 

     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" 
       p:entityManagerFactory-ref="entityManagerFactory"/> 

     <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
      <property name="dataSource" ref="dataSource"/> 
      <property name="jpaVendorAdapter" ref="jpaAdapter"/> 
      <property name="loadTimeWeaver"> 
       <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 
      </property> 
      <property name="persistenceUnitName" value="p"/> 
     </bean> 

     <bean id="entityManager" class="org.springframework.orm.jpa.support.SharedEntityManagerBean"> 
      <property name="entityManagerFactory" ref="entityManagerFactory"/> 
     </bean> 

     <bean id="jpaAdapter" 
       class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" 
       p:database="HSQL" 
       p:showSql="false"/> 

任何人都可以建議如何或爲什麼我得到Hibernate異常而不是JPA(javax.persistence)?

附加信息:
春3.1.0.M2
的Hibernate 3.5.4決賽
Hibernate驗證4.1.0.Final
HSQLDB 2.0.0

回答

1

HSQLDB是不扔數據庫Java Bean驗證異常。異常類型是正確的 - 在這方面沒有什麼奇怪的。 Hibernate創建了PersistenceException並給出了更具體的異常原因:org.hibernate.exception.ConstraintViolationException。我們可以從javadoc中找到以下解釋:「表明請求的DML操作導致違反定義的完整性約束」。也許你有更長的棧跟蹤記錄的地方,這也包括JDBC驅動程序引發的異常?

如果不知道更多關於映射的信息以及您嘗試插入的文檔中的值,則無法說出違反了哪個完整性約束。

此異常的其他可能性是該實體實際上已經存在,因爲Hibernate有bug HHH-4131。在該錯誤報告中,有人告訴我們,某些版本的Hibernate會拋出PersistenceException而不是指定的EntityExistsException。

+0

我期待着一個異常,但我期待javax.validation.ConstraintViolationException不是javax.persistence.PersistenceException:org.hibernate.exception.ConstraintViolationException – SilentICE

+0

不要這樣做,顯然你沒有違反任何這樣的驗證約束,它會導致引發javax.validation.ConstraintViolationException。這種異常來自JSR-303驗證註釋。你得到的是因爲我在答案中解釋的原因。 –

+0

是的我現在看到驗證約束vs數據庫約束謝謝 – SilentICE