spring - 具有 Spring Data 和 Spring JPA 的 Atomikos - 持久性问题

标签 spring hibernate jpa spring-data atomikos

我们正在尝试为我们的新项目设置一个新的 JTA 事务配置。 该项目使用带有 atomikos JTA 事务管理器的 spring JPA 和 spring Data。

我们按照在 atomikos 教程之一中看到的那样配置了 xml。

目前我们成功地启动了我们的服务器。

问题是当我们尝试在 @Transactional 服务中使用 jpaRepository 持久化一个实体时,我们的日志显示 atomikos jta transnascion 正在发生并提交成功。 但是我们的数据库现在在表中显示了新条目。

我们之前遇到过类似的问题,当 2 个 bean 扫描相同的包并导致像上面那样的“伪持久”效果时。

这是我们的 xml:

<bean
    class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<tx:annotation-driven transaction-manager="transactionManager"
    proxy-target-class="true" />

<bean id="AtomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
    init-method="init" destroy-method="close">
    <property name="forceShutdown" value="false" />
</bean>

<bean id="AtomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp">
    <property name="transactionTimeout" value="300" />
</bean>

<bean id="transactionManager"
    class="org.springframework.transaction.jta.JtaTransactionManager"
    depends-on="AtomikosTransactionManager,AtomikosUserTransaction">
    <property name="transactionManager" ref="AtomikosTransactionManager" />
    <property name="userTransaction" ref="AtomikosUserTransaction" />
    <property name="allowCustomIsolationLevels" value="true" />
</bean>

<bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
    init-method="init" destroy-method="close">

    <property name="uniqueResourceName" value="DataSource" />
    <property name="xaDataSource" ref="dataBase" />
    <property name="poolSize" value="3" />

</bean>

<bean id="dataBase" class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"
    lazy-init="true">

    <property name="pinGlobalTxToPhysicalConnection" value="true" />
    <property name="url"
        value="mydb" />
    <property name="user" value="user" />
    <property name="password" value="password" />

</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="packagesToScan"
        value="packages" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
        </props>
    </property>
    <property name="dataSource" ref="dataSource" />
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="database" value="MYSQL" />
            <!-- <property name="databasePlatform" value="${hibernate.dialect}"/> -->
            <property name="showSql" value="false" />
            <property name="generateDdl" value="false" />
            <!-- <property name="hibernate.connection.autocommit" value="false"/> -->
        </bean>
    </property>
    <property name="jpaPropertyMap">
        <map>
            <entry key="hibernate.connection.autocommit" value="false" />
        </map>
    </property>
</bean>

知道这个配置文件有什么问题吗?

谢谢!

最佳答案

事实证明,我们在 entityManagerFactory 的 jpaPropertyMap 中缺少一些属性。 这是它的正确配置:

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="packagesToScan"
        value="packages" />
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
        </props>
    </property>
    <property name="dataSource" ref="dataSource" />
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="database" value="MYSQL" />
            <property name="showSql" value="false" />
            <property name="generateDdl" value="false" />
        </bean>
    </property>
    <property name="jpaPropertyMap">
        <map>
            <entry key="javax.persistence.transactionType" value="JTA" />
            <entry key="hibernate.current_session_context_class" value="jta" />
            <entry key="hibernate.transaction.manager_lookup_class"
                value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
            <entry key="hibernate.connection.autocommit" value="false" />
        </map>
    </property>
</bean>

关于spring - 具有 Spring Data 和 Spring JPA 的 Atomikos - 持久性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20687470/

相关文章:

java - Spring mvc - 如何在不同的 Controller 中使用或发送相同的对象?

spring - Grails 3.1.16 - 从预定服务调用 session 范围服务的方法

java - 使用 Mockito 模拟 hibernate 的 SessionFactory 时出现问题

java - 映射通过引用未知的目标实体属性 - hibernate 错误 maven 注释

java - Eclipselink、c3p0 和 Spring - 创建太多连接!

java - 在 <context :component-scan>? 中包含子包的语法是什么

spring - SpringMVC中Model和HttpServletRequest的用法有什么区别? HttpServletRequest可以完全替代Model吗?

java - 单个 hibernate session 中的多个事务(使用 Spring)

mysql - JPA saveall方法是否使用hibernate批处理来更新/插入

java - 如何直接使用外键加入JPA?