que ejemplos ejemplo data spring jpa testing jta atomikos

ejemplos - Spring/JTA/JPA La prueba de integración DAO no se revierte?



spring hibernate maven (2)

Creo que deberás revisar los registros en detalle. Podría ser que los retrocesos que está viendo están funcionando, excepto que algo más ha ejecutado primero una confirmación. Tampoco puedo ver nada en tu código que indique retroceso automatizado. Y que debería ocurrir al final de cada prueba. Si depende de una reversión basada en el tiempo de espera, es posible que la segunda prueba se esté ejecutando antes de que se agote el tiempo de espera, por lo tanto, ve los datos antes de que se retrotraigan.

Muchas opciones aquí hay :-)

Mis pruebas de integración DAO están fallando porque las entidades creadas durante las pruebas todavía están en la base de datos al comienzo de la próxima prueba. El mismo comportamiento se ve tanto en MySQL 5 como en H2.

Las clases de prueba se anotan con:

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

La configuración del bean transaccional en el contexto de la aplicación de prueba es la siguiente:

<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>

El administrador de entidades se configura de la siguiente manera:

<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 />

Todo en los archivos de registro parece estar bien ... Puedo ver mensajes de Spring sobre rollback y de Atomikos sobre rollback también. Pero, francamente, los registros son tan grandes y complejos que podría extrañar algo ...

¡Sin embargo, los datos de prueba insertados permanecen! ¿Alguna pista?


Resultó que mi fuente de datos C3P0 JDBC no era consciente de XA y, por lo tanto, no participaba en la transacción. Por qué no obtuve un error, ni una advertencia en el archivo de registro, no sé. No obstante, aquí se explica muy bien la razón por la que no se puede usar una fuente de datos compatible con XA. Tenga en cuenta que la fuente de datos no necesita ser compatible con XA ... solo tiene conocimiento de XA.

Reemplazar el origen de datos C3P0 con el siguiente resolvió el problema.

<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>