Поставщик Spring JPA выдает исключительную ситуацию при неудачной оптимистической блокировке - PullRequest
0 голосов
/ 22 августа 2011

В случае сбоя в оптимистической блокировке я ожидаю, что менеджер сущностей JPA сгенерирует javax.persistence.OptimisticLockingException

Тем не менее, когда я использую Spring orm jpa, он предоставляет ObjectOptimisticLockingException, который не связан с ожидаемым - поэтому вопросесть WTF?Я неправильно понимаю документацию JPA, или весенние парни проигнорировали стандарты?

Самое забавное, что в тестовом примере JUnit генерируется правильное исключение (Wrapping StaleObjectException), а в веб-приложении это FUBAR.Конфигурация пружины используется повторно для модульного тестирования.

Вот код для ясности:

<!-- 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 Ответ

1 голос
/ 22 августа 2011

Это не ошибка, это особенность. Spring HibernateTemplate и его перехватчики вокруг репозиториев преобразуют исключения в исключения Spring. Идея состоит в том, что если у вас есть DAO на основе Hibernate, DAO на основе iBatis или DAO на основе JDBC, все они выдают одинаковые типы исключений, так что клиентскому коду это не нужно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...