2017-11-06 7 views
0

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.

+0

Können Sie teilen Sie uns Ihre ShrinkWrap-Definition mit? Vielleicht bündeln Sie die SQL-Datei nicht. – lordofthejars

+0

@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

Antwort

0

OK, eine etwas suboptimale Lösung ist das Hinzufügen dieser Implementierung spezifische Option zur Persistenz-Unit-Konfiguration:

<property name="hibernate.id.new_generator_mappings" value="false"/> 

ich eine andere Frage gestellt haben, die wahrscheinlich das Problem genauer Adressen: JPA 2.1 testing: persisting the pre-loaded data

+0

Siehe 'javax.persistence.hibernate.hbm2ddl.import_files' auf http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#configurations-hbmddl. Es ist ein Hinweis "Diese Anweisungen werden nur ausgeführt, wenn das Schema erstellt wird, was bedeutet, dass hibernate.hbm2ddl.auto auf Create-Drop oder Update gesetzt ist." –

+0

@ JamesR.Perkins: ja, danke, ich bin mir dessen bewusst. Äh ... wie ist das relevant für die Frage? – badbishop

+0

Entschuldigung. Ich habe die Eigenschaft 'javax.persistence.schema-generation.database.action' vermisst. –