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

我的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,因此不参与该事务.为什么我没有收到错误,也没有在日志文件中发出警告,我不知道.尽管如此,here还是很好地解释了你不能使用XA感知数据源的原因.请注意,数据源不需要支持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>
上一篇:com.atomikos.datasource.ResourceException: XA resource 'masterDB': resume for XID异常


下一篇:Hibernate 5与Spring JTA