我有一個基於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
我期待着一個異常,但我期待javax.validation.ConstraintViolationException不是javax.persistence.PersistenceException:org.hibernate.exception.ConstraintViolationException – SilentICE
不要這樣做,顯然你沒有違反任何這樣的驗證約束,它會導致引發javax.validation.ConstraintViolationException。這種異常來自JSR-303驗證註釋。你得到的是因爲我在答案中解釋的原因。 –
是的我現在看到驗證約束vs數據庫約束謝謝 – SilentICE