Spring JPA提供程序在乐观锁失败时产生wring异常

时间:2011-08-22 14:01:38

标签: spring jpa

如果乐观锁定失败,我希望JPA实体管理器抛出javax.persistence.OptimisticLockingException

然而,当我使用spring orm jpa时,它提供的ObjectOptimisticLockingException与预期的无关 - 所以问题是,WTF?我是否误解了JPA文档,还是春天的家伙忽视了标准?

最有趣的是,在JUnit测试用例中抛出了适当的异常(Wrapping StaleObjectException), 而在网络应用程序中它是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 个答案:

答案 0 :(得分: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