Frühjahr / JTA / JPA-unit-test : Rollback funktioniert nicht
Ich bin versuchen zu testen, ein Unternehmen mit EJB3 Spring.
Die EJB selbst nicht verwendet wird Frühling und ich möchte zu halten Vervielfältigungen der Produktion JPA-Konfiguration minimal (dh, nicht duplizieren persistence.xml für exemple).
Meine unit-tests scheint zu arbeiten, aber auch wenn meine unit-tests sollte transactionnal, Daten persistent ist zwischen den verschiedenen test-Methoden ...
Hier ist mein Unternehmen :
package sample;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class Ejb3Entity {
public Ejb3Entity(String data) {
super();
this.data = data;
}
private Long id;
private String data;
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
Mein unit-test :
package sample;
import static org.junit.Assert.*;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"/appContext.xml"})
@Transactional
public class Ejb3EntityTest {
@PersistenceContext
EntityManager em;
@Before
public void setUp() throws Exception {
Ejb3Entity one = new Ejb3Entity("Test data");
em.persist(one);
}
@Test
public void test1() throws Exception {
Long count = (Long) em.createQuery("select count(*) from Ejb3Entity").getSingleResult();
assertEquals(Long.valueOf(1l), count);
}
@Test
public void test2() throws Exception {
Long count = (Long) em.createQuery("select count(*) from Ejb3Entity").getSingleResult();
assertEquals(Long.valueOf(1l), count);
}
}
und meine appContext.xml :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean" />
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager">
<property name="userTransaction" ref="jotm" />
<property name="allowCustomIsolationLevels" value="true" />
</bean>
<bean id="dataSource" class="org.enhydra.jdbc.standard.StandardXADataSource">
<property name="driverName" value="org.h2.Driver" />
<property name="url" value="jdbc:h2:mem:unittest;DB_CLOSE_DELAY=-1" />
<property name="user" value="" />
<property name="password" value="" />
<property name="transactionManager" ref="jotm" />
</bean>
<bean id="emf"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitPostProcessors">
<bean class="sample.JtaDataSourcePersistenceUnitPostProcessor">
<property name="jtaDataSource" ref="dataSource" />
</bean>
</property>
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="false" />
<property name="generateDdl" value="true" />
<property name="database" value="H2" />
<property name="databasePlatform" value="org.hibernate.dialect.H2Dialect" />
</bean>
</property>
<property name="jpaPropertyMap">
<map>
<entry key="hibernate.transaction.manager_lookup_class"
value="org.hibernate.transaction.JOTMTransactionManagerLookup" />
<entry key="hibernate.transaction.auto_close_session" value="false" />
<entry key="hibernate.current_session_context_class" value="jta" />
</map>
</property>
</bean>
</beans>
Wenn ich mein test", "test2" schlägt fehl, weil es findet 2 Stelle ich erwartete nur eine (die erste gewesen sein sollte rollbacked ...)
Habe ich versucht viele verschiedene Konfigurationen und dieses scheint mir das umfassendste, die ich bekommen kann ... ich habe keine andere Ideen. Tun Sie ?
Denn ich bin mit der @Transactional-annotation, die jeder macht, Testlauf Verwendung eine eigene Transaktion, die automatisch rollbacked bis zum Frühjahr.
InformationsquelleAutor Michel | 2009-10-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn ich versuche zu integrieren, JOTM und Hibernate, die ich letztendlich endete mit code meine Umsetzung der ConnectionProvider. Hier ist, was es sieht aus wie jetzt: http://pastebin.com/f78c66e9c
Dann geben Sie Ihre Implementierung als die Verbindung privider im Ruhezustand Eigenschaften und Transaktionen magisch zu arbeiten beginnen.
Die Sache ist, dass die Standard-Verbindung-provider Anrufe getConnection() an datasource. In Ihrer eigenen Implementierung, die Sie anrufen getXAConnection().getConnection(). Das macht den Unterschied
InformationsquelleAutor artemb
Schaffte ich es eine Arbeit über Bitronix anstelle von JOTM. Bitronix bietet eine LrcXADataSource, dass es ein non-XA-Datenbank zu beteiligen, die JTA-Transaktion.
Ich denke, die Probleme waren, dass H2 nicht XA-konform und der enhydra
StandardXADataSource
macht es nicht so magisch (ich landete auch mit HSQLDB aber das ist nicht das Problem).Hier ist meine Frühlings-Kontext arbeitet :
InformationsquelleAutor Michel
Edit: (Sorry, scheint, ich war nur halb wach, als ich schrieb diesen Absatz. Natürlich hast du Recht, sollte alles zurückgesetzt werden, indem der Standardeinstellung).
Könnte man überprüfen, was der Transaktions-manager ist auch wirklich zu tun, zum Beispiel durch aktivieren der debug-Ausgabe.
Vorausgesetzt, log4j:
Der transaction manager bietet Ihnen sehr schöne log-Ausgabe über erstellte und verknüpfte Transaktionen, commits und rollbacks. Das sollte Ihnen helfen, herauszufinden, was funktioniert nicht mit deinem setup.
InformationsquelleAutor Henning
Hinzufügen @Rollback-annotation (aus org.springframework.test.Anmerkung), kurz nach der @Transactional annotation wie bereits erwähnt in der spring-Dokumentation.
InformationsquelleAutor Nageswara RaO Maridu