¿Cómo importar datos iniciales a la base de datos con Hibernate?

Al implementar aplicaciones, a menudo uso la capacidad de Hibernate para crear un esquema de base de datos para simplificar la implementación. Esto se puede lograr fácilmente configurando la propiedad hibernate.hbm2ddl.auto.

Sin embargo, en ocasiones también necesito insertar algunos datos iniciales en la base de datos, por ejemplo, usuario root. ¿Hay alguna manera de lograr esto a través de Hibernate con algún tipo de carga de archivo de texto?

Sé que podría progtwigr fácilmente el código que lo hará, pero me pregunto si ya hay alguna utilidad que pueda ayudarme a lograr la misma configuración de vía.

Encontré esto haciendo una búsqueda en “accesorios Hibernate”:

Hibernate creará la base de datos cuando se cree la fábrica del administrador de la entidad (en realidad, cuando la fábrica del administrador de la entidad crea SessionFactory de Hibernate). Si existe un archivo llamado import.sql en la raíz de la ruta de la clase (‘/import.sql’), Hibernate ejecutará las sentencias SQL leídas desde el archivo después de la creación del esquema de la base de datos. Es importante recordar que antes de que Hibernate cree el esquema, lo vacía (elimina todas las tablas, restricciones o cualquier otro objeto de base de datos que vaya a crearse en el proceso de creación del esquema).

Fuente: http://www.velocityreviews.com/forums/t667849-hibernate-quotfixturesquot-or-database-population.html

¡Pruébalo y avísanos si funciona!

Agregar import.sql a la ruta de clase funciona muy bien, hbm2ddl comprueba si el archivo existe y lo ejecuta. El único detalle adicional es que cada comando sql debe estar en su propia línea, de lo contrario no se ejecutará.

Esto también funcionará solo si hbm2ddl.auto está configurado para create o create-drop .

Añada la propiedad de hibernación hibernate.hbm2ddl.import_files en su configuración de hibernación. Cambie la propiedad hibernate.hbm2ddl.auto para crear. Agregue initial_data.sql en el directorio / classes con el código sql inicial para insertar datos. Hibernate ejecutar esto después de crear el esquema de la base de datos.

     ${hibernate.dialect} ${hibernate.show_sql} create initial_data.sql    

Si no desea agregar una propiedad en su configuración de hibernación, puede crear un archivo import.sql en el directorio / classes e hibernate usar esto de manera predeterminada si la propiedad hibernate.hbm2ddl.auto es igual a crear

Por qué las propiedades hbm2ddl.auto y hbm2ddl.import_files son malas

(Cuando se utiliza incorrectamente como una herramienta para la gestión de cambio de base de datos)

Como se dijo en otro lugar , el uso de hibernate.hbm2ddl.auto y hibernate.hbm2ddl.import_files para la administración de cambios en la base de datos tiene algunos inconvenientes importantes:

  1. Solo la estructura puede ser cambiada. Los valores existentes pueden sobrescribirse o, en el peor de los casos, enviarse a Nirvana. Sin una herramienta como liquibase o scriptella , no tiene ninguna capacidad de ETL .
  2. Este método no tiene transacciones. Tanto la estructura como los estados de datos se ejecutarán antes de que un gerente de transacción se haga cargo. Supongamos que tiene un error en la statement 42 de 256. Su base de datos está en un estado incoherente ahora.
  3. Imvho, pierdes transparencia y control: cuando un script scriptella o un cambio de liquibase se establecen o generalmente se comprometen junto con los cambios en los modelos de dominio, haces un cambio en el modelo de dominio y esperas (básicamente) que hibernate descubra qué hacer. (No es así, pero esa es una historia diferente).
  4. Para la prueba de integración, sistema y aceptación, simplemente asume que las bases de datos de prueba se encuentran en el mismo y absolutamente exacto estado que su base de datos de producción. Tienes que hacer un seguimiento de eso manualmente (¡Buena suerte y diviértete con eso!;)). En caso de que cometa un error, solo un pequeño deslizamiento es suficiente, los resultados pueden ser muy catastróficos.

Personalmente utilizo liquibase para la gestión de cambios de bases de datos y he desarrollado el siguiente flujo de trabajo para reducir el trabajo de mantenimiento:

  • Crear un registro de cambios desde la línea de comando de mi última estructura de publicación
  • Crear un registro de cambios de mi última base de datos
  • Manualmente difieren tanto los registros de cambios (por lo general, los cambios no son tan grandes, y si lo son, por lo general cumplen con una de las deficiencias del comando de diff liquibases .
  • crear un conjunto de cambios

Incluso para los cambios complicados en los que se debe implementar un CustomChange , esto se puede lograr en cuestión de horas, incluida la definición de retrocesos, pruebas y documentación. Para cambios triviales, es cuestión de minutos. Básicamente: tienes que trabajar un poco más (he creado conjuntos de cambios personalizados para 4 configuraciones de bases de datos en menos de un día), pero obtienes la tranquilidad de que has hecho todo lo posible para mantener la base de datos en un estado constante.

Después de un par de horas tropezando con esto, decidí compartir lo que encontré, aunque es una publicación muy antigua.

Para que funcione correctamente, tuve que hacer lo siguiente:

  • hbmddl configurado para create o create-drop
  • file.sql en la raíz de classpath; en mi caso, solo lo puse en resources carpeta de resources , estoy usando maven.
  • cada comando sql en una línea
  • cada archivo.sql debe tener una línea en blanco al principio del archivo ==> no sé la razón de esto, pero si no inserto esa línea en blanco, en el momento de la ejecución los servidores me dicen que hay una error de syntax cerca del primer caracter.

Espero que ayude.

Intereting Posts