2013-12-12 9 views
8

Ich brauche das für einen Integrationstest. Meine Umgebung ist JBoss 7, EJB3 mit JPA auf Hibernate 4, H2 In-Memory-Datenbank und Tests werden von Arquillian ausgeführt. Ich möchte in der Lage sein, die Datenbank zu löschen und neu zu erstellen, werden alle Tabellen basierend auf persistence.xml und den Entitäten. Ich weiß, dass ich es zu Beginn der Anwendung tun kann durch Angabe:Wie manuell create-drop von JPA auf Hibernate?

<property name="hibernate.hbm2ddl.auto" value="create-drop" /> 

Aber ich brauche diese aus dem Code nach dem ersten Tropfen manuell zu tun und passierte erstellen.

Ist es möglich? Was ist der einfachste Weg?

+0

Müssen Sie wirklich das Schema zwischen den Tests neu erstellen oder müssen Sie nur die Daten abschneiden? – FGreg

+0

@FGreg - alle Daten abschneiden und das Skript import.sql ausführen würde ausreichen. Problemumgehungen gibt es, aber ich war mehr interessiert, wenn es eine Möglichkeit gibt, in der Art wie Winterschlaf zu laufen ... – sm4

+0

Ich bin nicht sicher, was die Unterschiede zwischen JUnit und Arquillian sind, aber ich habe eine Lösung für JUnit, die alle Daten abschneidet nach jedem Test. Wenn Sie interessiert sind, könnte ich es teilen, ich weiß nur nicht, wie nützlich es sein wird, da es sich ziemlich stark auf JUnit-Konstrukte verlässt. – FGreg

Antwort

0

Ich denke, Sie müssen die Skripte manuell erstellen. Sie können dann mit ScriptRunner (die Klasse in Ihrem Projekt kopieren):

public class YourIntegrationTestClass { 
    private String url = "test-db-url"; 
    private String user = "user"; 
    private String pass = "pass"; 

    // run this before the test 
    public void prepareDB() { 
     // executes a script stored in test/resources/cucumber 
     try { 
      // use your driver here 
      Class.forName("com.mysql.jdbc.Driver"); 
      Connection conn = DriverManager.getConnection(url, user, pass); 
      ScriptRunner runner = new ScriptRunner(conn, false, true); 

      // use your db creation script here 
      runner.runScript(new BufferedReader(new FileReader("createDB.sql"))); 
     } catch (Exception e) { 
      throw new RuntimeException(e.getMessage(), e); 
     } 
    } 

    // run this after the tests 
    public void dropDB() { 
      // use your driver here 
      Class.forName("com.mysql.jdbc.Driver"); 
      Connection conn = DriverManager.getConnection(url, user, pass); 
      ScriptRunner runner = new ScriptRunner(conn, false, true); 

      // use your db drop script here 
      runner.runScript(new BufferedReader(new FileReader("dropDB.sql"))); 
     } catch (Exception e) { 
      throw new RuntimeException(e.getMessage(), e); 
     } 
    } 
} 
+0

Ihr ScriptRunner kann Hibernate ImportSqlCommandExtractor (http://docs.jboss.org/hibernate/core/4.1/javadocs/org/hibernate/tool/hbm2ddl/ImportSqlCommandExtractor.html) für einen besseren SQL-Parser verwenden (siehe Multiline- und Singleline-Extraktor) . Prost –

3

Sie können dies in den Ruhezustand programmatisch tun.

config = new Configuration(); 
config.setProperty(org.hibernate.cfg.Environment.SHOW_SQL, "true"); 
config.setProperty(org.hibernate.cfg.Environment.HBM2DDL_AUTO, "create"); 
.... 
SchemaExport export = new SchemaExport(config); 
export.create(true, true); 

Die JavaDocs sind hier:

http://docs.jboss.org/hibernate/core/3.5/javadocs/org/hibernate/cfg/Configuration.html http://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/tool/hbm2ddl/SchemaExport.html

+0

Funktioniert das für Sie? Ich habe es ausprobiert, aber ohne Auswirkungen auf die db – mkn