2012-03-22 26 views
6

Tengo un proyecto JPA y me gustaría insertar algunos datos iniciales solo en el desarrollo, para poder verificar si todo funciona sin problemas.¿Cómo cargar datos iniciales (o datos iniciales) utilizando Java JPA?

Mi investigación me llevó a encontrar la única solución con script SQL directo, pero eso no es correcto. Si estoy usando un marco para abstraer los detalles de la base de datos, ¿por qué crearía un script para una base de datos específica?

En el mundo de ruby ​​on rails tenemos el comando "rake db: seed" que simple ejecuta un archivo llamado seed.rb que tiene la función de agregar los datos iniciales en la base de datos llamando a la capa de abstracción. ¿Hay algo así en Java?

La solución ideal que se me ocurre sería ejecutar un objetivo maven que ejecute una clase java, ¿hay alguna manera fácil o un plugin maven para hacerlo?

Respuesta

4

Siento tu dolor, he estado queriendo en un proyecto de Java todas las ventajas que tiene Rails.

Dicho esto, no hay ninguna razón para usar SQL directo. Ese enfoque es solo pedir problemas. A medida que su esquema de base de datos cambia durante el desarrollo, todos los frágiles SQL se rompen. Es más fácil administrar los datos si están mapeados a los modelos JPA, que abstraerán la interacción SQL con la base de datos.

Lo que debe hacer es utilizar sus modelos JPA para inicializar sus datos. Cree un componente que pueda ejecutar la creación de los modelos que necesita y persistir. En mi proyecto actual, usamos Snake YAML para serializar nuestros Modelos como Yaml. Para sembrar nuestra base de datos, deserializamos los modelos yaml a JPA y persistimos.

Si los modelos cambian (los tipos de variables cambian, eliminan columnas, etc.), debe asegurarse de que los datos de serialización aún puedan deserializarse correctamente en los modelos JPA. El uso del formato legible de Yaml hace que sea fácil actualizar los modelos serializados.

Para ejecutar realmente sus datos de inicialización, arranque su sistema como sea posible. Como dijo @GeoorgeMcDowd, puedes usar un Servlet. Personalmente prefiero crear una herramienta de línea de comandos creando un uberjar con Class.main. Entonces solo necesita crear una secuencia de comandos para configurar su classpath y llamar al Class.main para ejecutar la semilla.

Personalmente, amo a Maven como metadatos de proyecto pero me resulta difícil como una herramienta de compilación. Lo siguiente puede ser utilizado para ejecutar una clase Java:

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

¿Por qué necesita serializar/deserializar su modelo a YAML? –

+0

No necesariamente tiene que ser YAML, cualquier forma de serializar los modelos a un archivo servirá. Luego puede usar los archivos como datos iniciales para la base de datos. Yaml solo tiene el beneficio de ser fácil de trabajar para leer y editar. – mguymon

+0

+1 para la idea de YAML ... ¡bien! – HDave

2

Solo crea una clase y método que crea los objetos y persiste los datos. Cuando inicie su aplicación, ejecute el método que creó en un servlet init. Puede cargar su servlet con la siguiente configuración web.xml.

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

Editar: Formatea web.xml para ser más fácil de leer.

+0

Como alternativa, puede hacerlo desde un Spring Bean y, por lo tanto, se puede hacer sin un contenedor de servlet para realizar pruebas de integración. – HDave

1

Puede modelar su proyecto con Maven y escribir una prueba simple para inicializar los datos de inicialización, por lo que lo único que tendrá que hacer es ejecutar "prueba mvn".

0

Similar a la idea de amuniz: echar un vistazo a dbunit. Es una extensión JUnit para registrar datos de prueba en un db. Utiliza un formato xml sin esquema simple para eso. Y ejecutarlo a través de una clase de prueba con "mvn test" es algo simple de hacer.

+0

He hecho esto y mientras funciona, el XML resultante es tan frágil como el SQL que OP intentaba evitar en primer lugar. – HDave

+1

Puede reducir parte de la fragilidad y la repetición manual al incluir una herramienta de migración de db, como liquibase, en su producción, así como en la gestión de datos de prueba. – nansen

-1

Sugeriría liquibase http://www.liquibase.org/ para esto.Tiene muchos complementos y le permite definir la lógica de reversión para cada conjunto de cambios (y detectar la reversión en algunos casos).

En este caso, es importante también pensar en los servidores de producción y cómo los datos de semilla se moverán a producción.

Cuestiones relacionadas