2012-03-22 8 views
6

Ho un progetto JPA e vorrei inserire alcuni dati iniziali solo in fase di sviluppo, così posso verificare se tutto sta procedendo senza intoppi.Come caricare i dati iniziali (oi dati seme) utilizzando Java JPA?

Le mie ricerche mi hanno portato a trovare solo una soluzione con script SQL diretto, ma non è giusto. Se sto usando un framework per astrarre i dettagli del database, perché dovrei creare uno script per un database specifico?

Nel mondo ruby ​​on rails abbiamo il comando "rake db: seed" che esegue semplicemente un file denominato seed.rb che ha la funzione di aggiungere i dati iniziali sul database chiamando il livello di astrazione. C'è qualcosa del genere su java?

La soluzione ideale che posso pensare sarebbe quella di eseguire un obiettivo esperto che eseguirà una classe java, c'è un modo semplice o un plug-in di esperti per farlo?

risposta

4

Sento il tuo dolore, sono andato volendo in un progetto Java per tutti i vantaggi di Rails.

Detto questo, non vi è alcun motivo per utilizzare direttamente SQL. Questo approccio richiede solo guai. Quando lo schema del database cambia durante lo sviluppo, tutte le fragili interruzioni SQL. È più facile gestire i dati se è mappato a Modelli JPA, il che astraggerà l'interazione SQL con il database.

Quello che dovresti fare è usare i tuoi modelli JPA per seminare i tuoi dati. Crea un componente in grado di eseguire la creazione di modelli richiesti e di mantenerli. Nel mio attuale progetto, usiamo Snake YAML per serializzare i nostri modelli come Yaml. Per seminare il nostro database, deserializzare i modelli yaml in JPA e persistere.

Se i modelli cambiano (cambiano i tipi di variabile, rimuovono colonne, ecc.), È necessario assicurarsi che i dati di serializzazione siano ancora in grado di deserializzare correttamente nei modelli JPA. Utilizzando il formato leggibile da umani di Yaml è facile aggiornare i modelli serializzati.

Per eseguire effettivamente i dati seme, avviare il sistema, tuttavia è possibile. Come ha detto @GeoorgeMcDowd, puoi usare un servlet. Personalmente preferisco creare uno strumento da riga di comando creando un uberjar con Class.main. Quindi è sufficiente creare uno script per impostare il classpath e chiamare lo Class.main per eseguire il seme.

Personalmente, adoro Maven come metadati del progetto ma lo trovo difficile come strumento di costruzione. Ciò che segue può essere utilizzata per exec una classe Java:

mvn exec:java -Dexec.mainClass="com.package.Main" 
+0

Perché è necessario serializzare/deserializzare il modello su YAML? –

+0

Non necessariamente deve essere YAML, qualsiasi metodo per serializzare i modelli in un file lo farà. Quindi è possibile utilizzare i file come dati seme per il database. Yaml ha solo il vantaggio di essere facile da lavorare per la lettura e la modifica. – mguymon

+0

+1 per l'idea YAML ... bello! – HDave

2

Basta creare una classe e un metodo che crea gli oggetti e persiste i dati. Quando si attiva l'applicazione, eseguire il metodo che è stato creato in un servlet init. È possibile caricare il servlet con la seguente configurazione web.xml.

<servlet> 
    <servlet-name>MyServlet1</servlet-name> 
    <servlet-class>com.example.MyServlet1</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

Modifica: Formato web.xml per essere più facile da leggere.

+0

In alternativa è possibile farlo da un bean Spring e quindi può essere eseguito senza un contenitore servlet per il test di integrazione. – HDave

1

È possibile modellare il progetto con Maven e scrivere un semplice test per inizializzare i dati seme, quindi l'unica cosa che è necessario eseguire è eseguire "mvn test".

0

simile all'idea di amuniz: dare un'occhiata a dbunit. È un'estensione JUnit per la pupolazione dei dati di test in un db. Per questo utilizza un semplice formato xml senza schema. E eseguirlo attraverso una classe di test usando "mvn test" è una cosa semplice da fare.

+0

Ho fatto questo e mentre funziona, l'XML risultante è fragile quanto l'SQL che l'OP stava cercando di evitare in primo luogo. – HDave

+1

È possibile ridurre parte della fragilità e della rilavorazione manuale includendo uno strumento di migrazione db, come liquibase, nella produzione e la gestione dei dati di test. – nansen

-1

Suggerirei liquibase http://www.liquibase.org/ per questo.Ha molti plug-in e consente di definire la logica di rollback per ogni set di modifiche (e in alcuni casi rilevare il rollback).

In questo caso è importante pensare anche ai server di produzione e al modo in cui i dati seme verranno spostati in produzione.

Problemi correlati