2013-12-19 127 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。