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>
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top