gpt4 book ai didi

Spring/JTA/JPA DAO 集成测试不回滚?

转载 作者:行者123 更新时间:2023-11-28 19:51:31 25 4
gpt4 key购买 nike

我的 DAO 集成测试失败了,因为在测试期间创建的实体在下一次测试开始时仍在数据库中。从 MySQL 5 和 H2 中可以看到完全相同的行为。

测试类注释为:

@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration( { "/testPersist-applicationContext.xml" })

测试应用上下文中的事务bean配置如下:

<tx:annotation-driven />

<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
</bean>

<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="myappTestLocalEmf"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myapp" />
<property name="persistenceUnitPostProcessors">
<bean class="com.myapp.core.persist.util.JtaPersistenceUnitPostProcessor">
<property name="jtaDataSource" ref="myappPersistTestJdbcDataSource" />
</bean>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="database" value="$DS{hibernate.database}" />
<property name="databasePlatform" value="$DS{hibernate.dialect}" />
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup
</prop>
<prop key="hibernate.format_sql">true"</prop>
<prop key="hibernate.use_sql_comments">true</prop>
</props>
</property>
</bean>

<context:annotation-config />

日志文件中的一切似乎都很好...我可以看到来自 Spring 的关于回滚的消息以及来自 Atomikos 的关于回滚的消息。但坦率地说,日志是如此庞大和复杂,我很容易遗漏一些东西......

但插入的测试数据仍然存在!有什么线索吗?

最佳答案

事实证明,我的 C3P0 JDBC 数据源不是 XA 感知的,因此没有参与事务。为什么我没有收到错误,日志文件中也没有警告,我不知道。尽管如此,您不能使用 XA 感知数据源的原因得到了很好的解释 here .请注意,数据源不需要具备 XA 能力...只需具备 XA 意识即可。

将 C3P0 数据源替换为以下数据源解决了问题。

<bean id="myappJTANonXADataSource" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean">
<property name="uniqueResourceName" value="myappDatabase" />
<property name="driverClassName" value="$DS{hibernate.connection.driver_class}" />
<property name="url" value="$DS{hibernate.connection.url}" />
<property name="user" value="$DS{hibernate.connection.username}" />
<property name="password" value="$DS{hibernate.connection.password}" />
<property name="maxPoolSize" value="20" />
<property name="reapTimeout" value="300" />
</bean>

关于Spring/JTA/JPA DAO 集成测试不回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3128111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com