lunes, 4 de julio de 2016

Como autogenerar scripts SQL de forma incremental desde las entities JPA

¿Estas cansado de tener que escribir tus scripts de bbdd?¿Te gustaría poder trackearlos de una forma sencilla en tu repositorio? Hoy os voy a enseñar una solución sencilla para autogenerar a partir de vuestras entities JPA los scripts necesarios para crear el DDL de vuestra bbdd. Además, generaremos el SQL de forma incremental en cada versión del proyecto, es decir, generaremos Alter Tables en lugar de generar de nuevo todo el DDL con cada modificación de las entities. También crearemos dos bases de datos H2 en memoria, una con la versión ya publicada del DDL (released) y otra con las modificaciones añadidas durante el Sprint (snapshot), de forma que podremos crear tests de integración para probar la compatibilidad de ambas versiones. Esto promete... ¿verdad?. Pues empecemos viendo los plugins de Maven que vamos a usar:

build-helper-maven-plugin:
Lo utilizaremos para parsear la versión de nuestro proyecto, generando varias properties con la versión mayor, minor e incremental, que luego nos servirán para nombrar los ficheros.


 org.codehaus.mojo
 build-helper-maven-plugin
 1.10
 
  
   parse-version
   
    parse-version
   
  
 

copy-rename-maven-plugin:
Lo usaremos para copiar la ultima versión publicada de la bbdd, de esta forma, podemos evaluar los cambios que ha habido en el DDL desde ese momento, sin que tengamos que preocuparnos de cambios intermedios durante la versión: queremos generar un único fichero con todos los cambios en el DDL que se hayan producido.

 com.coderplus.maven.plugins
 copy-rename-maven-plugin
 1.0
 
  
   copy-file
   validate
   
    copy
   
   
    src/main/resources/db/example_released.mv.db
    src/main/resources/db/example_snapshot.mv.db
   
  
 


hibernate3-maven-plugin:
Hibernate se encargará de comparar la bbdd ´snapshot´, copia de la version ´released´ (y que será configurada en el persistenceUnit) con las entities JPA de nuestro proyecto, generando un fichero con el DDL necesario para actualizar la bbdd para que represente con exactitud a las entities.

 org.codehaus.mojo
 hibernate3-maven-plugin
 3.0
 
  
   validate
   
    hbm2ddl
   
  
 
 
  
   
   
  
 
 
  
   org.hibernate
   hibernate-entitymanager
   3.6.10.Final
  
  
   com.h2database
   h2
   1.4.191
  
 


flyway-maven-plugin:
Este plugin es capaz de leer los Scripts versionados con el DDL de la bbdd y ejecutarlos secuencialmente para generar un fichero H2 (released) con los mismos.

 org.flywaydb
 flyway-maven-plugin
 4.0.3
 
  
   db/scripts
  
  
   EXAMPLE_SCHEMA
  
  jdbc:h2:file:./src/main/resources/db/example_released
  sa
  
 
 
  
   install
   
    migrate
   
  
 
 
  
   com.h2database
   h2
   1.4.191
  
 


FLUJO:
En la solución propuesta tenemos dos profiles de maven:

createScript: ejecutará los 3 primeros plugins, de forma que, se copiará la ultima bbdd publicada con flyway (released), correspondiente a la ultima versión cerrada del proyecto. A partir de esta nueva bbdd (snapshot), hibernate evaluará las entities JPA del proyecto y generará el DDL con los cambios encontrados, los cuales se almacenarán en un fichero generado con la versión actual del proyecto. Adicionalmente se aplicarán estos cambios en la versión ´snapshot´ de la bbdd. Podemos ejecutar este profile tantas veces como necesitemos durante el desarrollo de la versión, resultando un único fichero con todos los cambios realizados.
releaseScript: Flyway se encargará de migrar los ficheros generados a la versión ´released´ de la bbdd H2. Ejecutaremos este profile junto al cierre de versión del proyecto.

Podéis encontrar todo el código de ejemplo en mi Gitlab siguiendo el siguiente enlace:
Proyecto de ejemplo en GitLab

No hay comentarios:

Publicar un comentario