Ich teste (oder versuche) meine JPA/EJB-Klassen gegen die WildFly10/H2-Datenbank mit Arquillian. Der Primärschlüssel für eine Entitätsklasse verwendet GenerationType.TABLE
. Die Persistenz-Einheit in /META-INF/persistence.xml
:WildFly10/Hibernate: vorgeladene Testdaten nicht persistent
<persistence-unit name="test">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<jta-data-source>java:/H2DS</jta-data-source>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create" />
<property name="javax.persistence.schema-generation.create-source" value="script" />
<property name="javax.persistence.schema-generation.create-script-source" value="META-INF/sql/create.sql" />
<property name="javax.persistence.sql-load-script-source" value="META-INF/sql/load_script.sql" />
<property name="javax.persistence.schema-generation.drop-source" value="script" />
<property name="javax.persistence.schema-generation.drop-script-source" value="META-INF/sql/drop.sql" />
</properties>
</persistence-unit>
Das Problem ist, dass die Daten angeblich von load_script.sql vorinstalliert werden soll, nicht durch die Zeit der Prüfung verpflichtet beginnt. Ich kann aus den Protokollen die SQL-Anweisungen sehen, um die Testdaten vorab zu laden, um die "Generatortabelle" zu aktualisieren, aber ich sehe keine Abfragen an die "Generatortabelle", um einen Stapel von Primärschlüsseln zu erhalten. Dann - keine Überraschung - endet der Versuch, eine Entität hinzuzufügen, in Constraint-Verletzung.
Die Frage: Wie man mit Hibernate sicherstellt, dass die Daten, die vom Skript vorgeladen werden, bestehen, bevor die Tests stattfinden?
Hinweis 1: Ich hatte dieses Problem mit EclipseLink/Glassfish4, aber das wurde behoben, indem sowohl das Schema erstellt als auch Daten von Skripten geladen wurden (zuvor wurde das Schema aus Entitätsklassen generiert).
Hinweis 2: Ohne Vorabladen von Daten laufen die Tests auf Glassgish4 und WildFly10 einwandfrei.
Können Sie teilen Sie uns Ihre ShrinkWrap-Definition mit? Vielleicht bündeln Sie die SQL-Datei nicht. – lordofthejars
@lordofthejars: Nein, das ist sicherlich nicht der Fall. Ich kann die Einfügungen aus dem Skript in den Protokollen sehen. Das Problem besteht darin, wie man JPA-Provider anweist: 1) Daten in die Generatortabelle zu putzen 2) dann eine neue Gruppe von IDs zuzuweisen und die Tabelle zu aktualisieren 3) dann die Entität von dem Test fortzuführen. Im Moment versucht es alle 3 Schritte innerhalb derselben Transaktion auszuführen, ignoriert jedoch die Tatsache, dass einige der vorab zugewiesenen IDs bereits für die Entitäten aus dem Skript verwendet werden. – badbishop