tutorial mvc framework español edicion cuarta books arquitectura accion database hibernate schema migrate

database - mvc - ¿Cómo actualizar un esquema de base de datos sin perder sus datos con Hibernate?



spring mvc 4 tutorial español (8)

Imagina que estás desarrollando una aplicación Java EE con Hibernate y JBoss. Tienes un servidor en ejecución que tiene algunos datos importantes en él. Usted lanza la siguiente versión de la aplicación de vez en cuando (1-2 semanas) y tienen un montón de cambios en la capa de persistencia:

  • Nuevas entidades
  • Entidades eliminadas
  • Cambios de tipo de atributo
  • Cambios de nombre de atributo
  • Cambios de relaciones

¿Cómo se configura efectivamente un sistema que actualice el esquema de la base de datos y conserve los datos? Por lo que sé (es posible que me equivoque), Hibernate no realiza alterar columna, soltar / alterar restricción.

Gracias, Artem B.


Como respuesta adicional a lo que dijo Nathan Voxland sobre LiquiBase , aquí hay un ejemplo para ejecutar la migración en Windows para una base de datos mySql:

Ponga el conector mysql debajo de la carpeta lib en la distribución liquibase, por ejemplo.

Cree propiedades de archivo liquibase.properties en la raíz de la distribución de liquibase e inserte estas líneas recurrentes:

driver: com.mysql.jdbc.Driver classpath: lib//mysql-connector-java-5.1.30.jar url: jdbc:mysql://localhost:3306/OLDdatabase username: root password: pwd

Genere o recupere una base de datos actualizada con otro nombre, por ejemplo, NEWdatabase .

Ahora extraerá las diferencias en un archivo Migration.xml con la siguiente línea de comando:

liquibase diffChangeLog --referenceUrl="jdbc:mysql://localhost:3306/NEWdatabase" --referenceUsername=root --referencePassword=pwd > C:/Users/ME/Desktop/Migration.xml

Finalmente, ejecute la actualización utilizando el archivo Migration.xml recién generado:

java -jar liquibase.jar --changeLogFile="C:/Users/ME/Desktop/Migration.xml" update

NB: Todas estas líneas de comando deben ejecutarse desde el directorio de inicio de liquibase donde están presentes liquibase.bat / .sh y liquibase.jar.


Para una aplicación, uso SchemaUpdate, que está integrado en Hibernate, directamente desde una clase de rutina de carga, por lo que el esquema se comprueba cada vez que se inicia la aplicación. Se encarga de agregar nuevas columnas o tablas, que es principalmente lo que sucede con una aplicación madura. Para manejar casos especiales, como eliminar columnas, el programa de arranque simplemente ejecuta manualmente el ddl en un try / catch, por lo que si ya se ha eliminado una vez, solo arroja un error de forma silenciosa. No estoy seguro de hacer esto con datos de misión crítica en una aplicación de producción, pero en varios años y cientos de implementaciones, nunca tuve un problema con eso.


Personalmente, sigo la pista de todos los cambios en un script SQL de migración.


Puede usar la herramienta https://github.com/Devskiller/jpa2ddl que proporciona los complementos de Maven y Gradle y es capaz de generar migraciones de esquema automatizadas para Flyway basadas en entidades JPA. También incluye todas las propiedades, dialectos, tipos de usuarios, estrategias de nombres, etc.


También puede utilizar DBMigrate . Es similar a Liquibase:

Similar a ''rake migrate'' para Ruby on Rails, esta biblioteca le permite administrar actualizaciones de base de datos para sus aplicaciones Java.


Uso la tarea ant de hbm2ddl para generar mi ddl. Hay una opción que realizará alterar tablas / columnas en su base de datos.

Consulte el atributo "actualización" de la tarea ant de hbm2ddl:

http://www.hibernate.org/hib_docs/tools/reference/en/html/ant.html#d0e1137

actualización (predeterminado: falso): intente y cree un script de actualización que represente el "delta" entre lo que está en la base de datos y lo que especifican las asignaciones. Ignora los atributos de crear / actualizar. (No utilice contra bases de datos de producción, no hay ninguna garantía de que se pueda generar el delta correcto ni que la base de datos subyacente pueda ejecutar las operaciones necesarias)



LiquiBase es tu mejor apuesta. Tiene un modo de integración de hibernación que utiliza hbm2ddl de Hibernate para comparar su base de datos y su asignación de hibernación, pero en lugar de actualizar la base de datos automáticamente, genera un archivo de registro de cambios liquibase que puede inspeccionarse antes de ejecutarse.

Si bien es más conveniente, cualquier herramienta que haga una comparación de su base de datos y sus asignaciones de hibernación cometerá errores. Consulte http://www.liquibase.org/2007/06/the-problem-with-database-diffs.html para ver ejemplos. Con liquibase usted construye una lista de cambios en la base de datos a medida que se desarrolla en un formato que puede sobrevivir al código con sucursales y fusiones.