2010-10-13 27 views
19

Actualmente estoy trabajando en una aplicación de escritorio que usa JPA/Hibernate para conservar datos en una base de datos H2. Tengo curiosidad por saber cuáles son mis opciones si necesito realizar cambios en el esquema de la base de datos en el futuro por alguna razón. Quizás tendré que introducir nuevas entidades, eliminarlas o simplemente cambiar los tipos de propiedades en una entidad.Compatibilidad con JPA/Hibernate para la migración?

  • ¿Hay soporte en JPA/Hibernate para hacer esto?
  • ¿Debo crear manualmente una solución de script?

Respuesta

19

Normalmente, dejo que Hibernate genere el DDL durante el desarrollo y luego creo un script de migración SQL manual al implementarlo en el servidor de prueba (que luego usaré también para UAT y servidores activos).

La generación DDL en Hibernate no ofrece soporte para migración de datos, si solo hace tanto como agregar un campo no nulo, la generación DDL no puede ayudarlo.

Aún no he encontrado ninguna abstracción de migración realmente útil para ayudar con esto.

Hay varias bibliotecas (eche un vistazo a this SO question para ver ejemplos), pero cuando está haciendo algo así como dividir una entidad existente en una jerarquía usando herencia unida, siempre vuelve a SQL simple.

+0

+1 por ser muy informativo :) – willcodejavaforfood

1

Hay dos opciones:

  • -db-hibernar - Espejo DB cambios a sus entidades de forma manual. Esto significa que su base de datos es "líder"
  • hibernación a DB - o bien utilizar hibernate.hbm2ddl.auto=update, o manualmente cambiar la base de datos después de cambiar su entidad - aquí el modelo de objetos está "liderando"
+0

¿Qué tipo de cambios puede hibernate.hbm2ddl = resolver automáticamente sin atornillar mi DB? :) – willcodejavaforfood

+0

casi cualquier. Excepto por las columnas desplegables, supongo, donde tendrás que soltarlas tú mismo. – Bozho

+1

No * use 'hbm2ddl = auto' en una configuración de producción; si lo hace, está pidiendo problemas. –

7

Tal vez' Tendré que introducir nuevas entidades, eliminarlas o simplemente cambiar los tipos de propiedades en una entidad.

no tengo ninguna experiencia con él, pero Liquibase proporciona algunas Hibernate Integration y puedo comparar sus asignaciones contra una base de datos y generar el registro de cambios apropiados:

La integración LiquiBase-Hibernate registra la base de datos cambios requeridos por su asignación de Hibernate actual a un archivo de registro de cambios que luego puede inspeccionar y modificar según sea necesario antes de la ejecución.

Todavía estás buscando una oportunidad de jugar con él y encontrar algunas respuestas a mis preguntas pendientes:

  • Funciona cuando se utiliza anotaciones?
  • ¿requiere un archivo hibernate.cfg.xml (aunque esto no sería un gran impedimento)?

Actualización: Ok, ambas preguntas están cubiertas por Nathan Voxland en this response y las respuestas son:

  • que funciona cuando se utiliza anotaciones
  • se requiere un hibernate.cfg.xml (por ahora)
+0

Genial, en realidad no tengo un archivo de mapeo de hibernación, solo un persistence.xml – willcodejavaforfood

+0

@willcodejavaforfood Sí, el mismo aquí. Pero mientras escribía, no estoy seguro de que pueda tratar con persistence.xml (estaba pensando en generar un hibernate.cfg.xml para reproducirlo si fuera necesario). Tal vez abrir otra pregunta y [Nathan Voxland] (http://stackoverflow.com/users/45756/nathan-voxland) (el creador de Liquibase) se mostrará :) –

+0

De acuerdo con esta [pregunta] (http: // stackoverflow .com/questions/776787/hibernate-using-jpa-annotated-entities-and-liquibase que necesita) necesita un hibernate.cfg.xml pero tiene razón en que no sería un gran problema – willcodejavaforfood

Cuestiones relacionadas