当前位置: 首页 > 知识库问答 >
问题:

具有Spring数据和Spring JPA的Atomikos-持久性问题

邓昊天
2023-03-14

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

正如在atomikos教程中看到的那样,我们配置了XML。

目前,我们设法启动我们的服务器没有错误。

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

我们之前也遇到过类似的问题,当2个bean扫描相同的包时,会产生如上所述的“psuedo persist”效果。

这是我们的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>

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

谢谢

共有1个答案

黄聪
2023-03-14

原来我们在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>
 类似资料:
  • 问题内容: 东西没有被冲走。发生的情况的简化示例: 输出: 我不知道是否必须对Session和Transaction进行某些操作才能使数据持久化,或者这是GPar中的错误。在底层的hibernate级别发生了什么? 我希望最近创建的Person在并行闭包中可见。 问题答案: Gpars是一个多线程工具,并且在您的域类中注入的hibernate会话不是线程安全的。 尝试使用以下方法或直接调用Sess

  • 数据落盘问题的由来 这本质上是数据持久化问题,对于有些应用依赖持久化数据,比如应用自身产生的日志需要持久化存储的情况,需要保证容器里的数据不丢失,在Pod挂掉后,其他应用依然可以访问到这些数据,因此我们需要将数据持久化存储起来。 数据落盘问题解决方案 下面以一个应用的日志收集为例,该日志需要持久化收集到ElasticSearch集群中,如果不考虑数据丢失的情形,可以直接使用前面提到的应用日志收集一

  • 我能知道Hazelcast支持磁盘持久性吗?换句话说,我可以使用Hazelcast作为常规数据库吗?(就像apache点火一样)。

  • 我的环境:OS:CentOS 7,Java:1.8.0_181,Maven:3.5.4,Quarkus:0.11.0 问候。

  • pinia的数据持久化,我用了个插件pinia-plugin-persist,用了该插件后数据是持久化了,但是取的值变成了字符串,需要序列化转换一下,例如:存入对象取出时时字符串,需要再次转换为对象才能使用,有没有什么好的方法,不用每次取值都转换一下?

  • 我正在工作的Android房间持久库。我还在我的项目中实现了双向数据绑定。在项目中,我插入用户的方法是填写一个表单,将所有用户显示在行中,然后单击“特定用户行”更新用户。下面是我的UserDao类: 对于数据绑定,我绑定UserFormActivity中的用户模型 在userModel中获取user数据进行更新后,我希望user数据在执行数据绑定的user表单中反映出来,但它没有反映出来。我被这个