Atomikos Rollback nicht klar JPA Persistenzkontext?
-
27-09-2019 - |
Frage
Ich habe eine Frühjahr / JPA / Hibernate-Anwendung und ich versuche, es zu bekommen, um meine Junit Integrationstests gegen H2 und MySQL übergeben. Derzeit bin ich mit Atomikos für Transaktionen und C3P0 für Verbindungs-Pooling.
Trotz meiner Bemühungen meines DAO Integration einer der Tests mit org.hibernate.NonUniqueObjectException versagt. Im Test versagt erstelle ich ein Objekt mit dem „neuen“ Betreiber, setzen die ID und die Aufforderung an sie bestehen bleiben.
@Test
@Transactional
public void save_UserTestDataNewObject_RecordSetOneLarger() {
int expectedNumberRecords = 4;
User newUser = createNewUser();
dao.persist(newUser);
List<User> allUsers = dao.findAll(0, 1000);
assertEquals(expectedNumberRecords, allUsers.size());
}
Im vorherigen Prüfmethode ich das gleiche tun (createNewUser () ist eine Hilfsmethode, die ein Objekt mit derselben ID jedem Mal erstellt). Ich bin sicher, dass die Erstellung und ein zweites Objekt mit der gleichen Id persistierenden die Ursache ist, aber jede Testmethode ist in eigener Transaktion und das Objekt, das ich auf eine private Testmethode Variable gebunden erstellt. Ich kann sogar in den Protokollen sieht, dass Feder-Test und Atomikos rollen die Transaktion mit jeder Testmethode zugeordnet zurück.
Ich würde das Rollback auch zu dem Persistenzkontext gelöscht habe gedacht. Auf einer Ahnung, habe ich einen Anruf zu dao.clear () zu Beginn des fehlerhaften Testverfahrens und das Problem ging weg !! So Rollback löscht nicht die Persistenzkontext ??? Wenn nicht, dann wer tut ??
Meine EntityManagerFactory Config ist wie folgt:
<bean id="myappTestLocalEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="myapp-core" />
<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="true" />
<property name="database" value="$DS{hibernate.database}" />
<property name="databasePlatform" value="$DS{hibernate.dialect}" />
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.transaction.factory_class">com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory</prop>
<prop key="hibernate.transaction.manager_lookup_class">com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<prop key="hibernate.format_sql">true"</prop>
<prop key="hibernate.use_sql_comments">true</prop>
</property>
</bean>
Lösung 2
Das Problem in diesem Fall ist am Ende, dass ich eine Anwendung hatte geschaffen, erweitert Transaktions EntityManager in meine DAOs injiziert. Der Grund dafür ist hier zu finden:
Problem Erstellen von JPA EntityMananger im Frühjahr Kontext
Nachdem ich meine feste Einheit Manager -. Alles funktionierte
Andere Tipps
Das ist seltsam. Aus der JPA-Spezifikation:
3.3.2 Transaktion Rollback
Für beide transaktionsbezogene und erweiterte Persistenzkontexte, Transaktion Rollback bewirkt, dass alle vorbestehenden verwaltete Instanzen und entfernte Instanzen sich ablösen. Die Landes Instanzen wird der Zustand der Instanzen an dem Punkt, an dem die Transaktion zurückgerollt. Transaktions-Rollback verursacht typischerweise die Persistenzkontext in einem sein inkonsistenter Zustand am Punkt des Rollbacks. Insbesondere der Zustand der Versionsattribute und erzeugt Zustand (Z.B. erzeugten Primärschlüssel) kann inkonsistent. Instanzen, die waren früher von der Beharrlichkeit geschafft Kontext (einschließlich der neuen Instanzen, dass daß wurden persistent gemacht Transaktion) kann daher nicht sein wiederverwendbar in der gleichen Weise wie andere frei stehende Objekte, zum Beispiel können sie fehlschlagen, wenn auf der Zusammenführung übergeben Betrieb.
So wie ich den obigen Abschnitt lesen ist, dass, wenn eine Transaktion zurückgesetzt wird, JPA seine Persistenzkontext löschen sollte.