2011-08-22 78 views
0

產生擰例外,但如果是在樂觀鎖失敗我希望JPA實體管理器拋出javax.persistence.OptimisticLockingException春天JPA提供商的樂觀鎖失敗

然而,當我使用ORM春天JPA提供ObjectOptimisticLockingException這是不與預期相關 - 所以問題是,WTF?我是否誤解JPA文檔,還是春天的人忽略了standarts?

最有趣的是,在JUnit測試用例中引發了適當的異常(包裝StaleObjectException), 而在Web應用程序中它是FUBAR。 Spring配置被重用於單元測試。

下面是清晰一些代碼:

<!-- JPA entity manager configuration --> 
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${database.driver}"/> 
    <property name="url" value="${database.url}"/> 
    <property name="username" value="${database.username}"/> 
    <property name="password" value="${database.password}"/> 
    <property name="testOnBorrow" value="${database.testonborrow}"/> 
    <property name="validationQuery" value="${database.validationquery}"/> 
</bean> 

<bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager"> 
    <property name="defaultDataSource" ref="dataSource"/> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitManager" ref="persistenceUnitManager"/> 
    <property name="persistenceUnitName" value="provisioning"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="generateDdl" value="true"/> 
     </bean> 
    </property> 
    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="hibernate.dialect" value="${hibernate.dialect}"/> 
      <entry key="hibernate.hbm2ddl.auto" value="${hibernate.hbm2ddl.auto}" /> 
      <entry key="hibernate.hbm2ddl.delimiter.type" value="InnoDB" /> 
      <entry key="hibernate.show_sql" value="${hibernate.show_sql}" /> 
     </map> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 

<context:annotation-config/> 

<tx:annotation-driven/> 

回答

1

這是不是一個錯誤,這是一個特點。 Spring的HibernateTemplate及其圍繞倉庫的攔截器將異常轉化爲Spring異常。這個想法是,如果你有一個基於Hibernate的DAO,一個基於iBatis的DAO或者一個基於JDBC的DAO,它們都會拋出相同類型的異常,這樣客戶端代碼就不必關心了。

http://static.springsource.org/spring/docs/3.1.0.M2/spring-framework-reference/html/dao.html#dao-exceptions

+0

有趣的是,我使用JPA,我得到JPA實體管理器,並希望得到JPA確認例外。我完全知道封面下面有hibernate,但是DI的整個意義在於不關心JPA,甚至在代碼中彈出。 –