2013-12-12 9 views
8

Ho bisogno di questo per un test di integrazione. Il mio ambiente è JBoss 7, EJB3 con JPA su Hibernate 4, database in memoria H2 e test eseguiti da Arquillian. Voglio essere in grado di rilasciare il database e crearlo nuovamente tutte le tabelle basate su persistence.xml e le entità. So che posso farlo all'inizio della richiesta specificando:Come richiamare manualmente la creazione di rilascio da JPA su Hibernate?

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

Ma ho bisogno di farlo manualmente dal codice dopo la prima goccia e creare successo.

È possibile? Qual è il modo più semplice?

+0

Hai davvero bisogno di ricreare lo schema tra i test o hai solo bisogno di troncare i dati? – FGreg

+0

@FGreg - troncare tutti i dati ed eseguire lo script import.sql sarebbe sufficiente. Esistono soluzioni alternative, ma ero più interessato se esiste un modo per eseguire il modo in cui l'ibernazione lo fa ... – sm4

+0

Non sono sicuro quali siano le differenze tra JUnit e Arquillian, ma ho una soluzione per JUnit che tronca tutti i dati dopo ogni test. Se sei interessato potrei condividerlo, semplicemente non so quanto sarà utile dato che si basa molto sui costrutti di JUnit. – FGreg

risposta

0

Penso che sarà necessario creare gli script manualmente. È quindi possibile utilizzare ScriptRunner (copiare la classe nel progetto):

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

Lo scriptRunner può utilizzare Hibernate ImportSqlCommandExtractor (http://docs.jboss.org/hibernate/core/4.1/javadocs/org/hibernate/tool/hbm2ddl/ImportSqlCommandExtractor.html) per un migliore analisi SQL (vedere estrattore multilinea e singleline) . Cheers –

3

È possibile programatically farlo in Hibernate.

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); 

I JavaDocs sono qui:

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

Funziona per te? L'ho provato ma senza alcun effetto sul db – mkn

Problemi correlati