2013-12-19 123 views
1

我在我的项目中使用Spring(3.2.4.RELEASE)和Hibernate(4.2.8.Final),并使用JPA配置。Spring,JPA,Hibernate 3和4

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

而且我使用hibernate乐观锁定版本控制机制,如下所示。

@Entity 
public class Entity { 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private int id; 

    @Version 
    @Generated(GenerationTime.ALWAYS) 
    private int version; 
} 

我的问题是,当我用错了版本更新的实体,它为什么扔

org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException

org.springframework.orm.hibernate4.HibernateOptimisticLockingFailureException

+0

其实这两个都很奇怪......我期待'JpaOptimisticLockingFailureException'或'ObjectOptimisticLockingFailureException'。当使用hibernate而不是jpa时应该抛出特定的'HibernateOptimisticLockingFailureException'。你不是偶然在你的上下文中有一个明确配置的'HibernateExceptionTranslator'? –

回答

1

spring-orm-3.2.4.RELEASE包含org.springframework.orm.hibernate3。*和org.springframework.orm.hibernate4。*的包。

所以,即使你在你的项目库中有hibernate-4.2.8.Final.jar,当你使用弹簧数据jpa时,任何一种错误的DB操作都会将所有检查的异常转换为未经检查的(运行时)hibernate异常HibernateExceptionTranslator来自org.springframework.orm.hibernate4.HibernateExceptionTranslator。

如果您希望使用3.0,请确保您在bean配置xml文件中使用了org.springframework.orm.hibernate3.HibernateExceptionTranslator。