¿Cómo importar datos iniciales a la base de datos con Hibernate?
-
21-08-2019 - |
Pregunta
Al implementar aplicaciones, suelo utilizar la capacidad de Hibernate para crear un esquema de base de datos con el fin de 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, el usuario root.¿Hay alguna manera de lograr esto mediante hibernación con algún tipo de carga de archivo de texto?
Sé que podría programar fácilmente el código que lo hará, pero me pregunto si ya existe alguna utilidad que pueda ayudarme a lograr lo mismo a través de la configuración.
Solución
He encontrado esto haciendo una búsqueda en "accesorios" de Hibernate:
Hibernate crear la base de datos cuando la fábrica gestor de la entidad es creado (en realidad cuando Hibernate SessionFactory es creado por el entidad fábrica manager). Si un archivo Existe llamado import.sql en la raíz de la ruta de clase ( '/import.sql') Hibernate ejecutar el SQL declaraciones leen desde el archivo después de la creación del esquema de base de datos. Es importante recordar que antes de hibernación se crea el esquema la vacía (borrar todas las tablas, restricciones, o cualquier otra base de datos objeto que va a ser creado en el proceso de construcción del esquema).
Fuente: http: //www.velocityreviews. com / foros / t667849-hibernate-quotfixturesquot-o-base-population.html
Darle una oportunidad y háganos saber si funciona!
Otros consejos
Adición import.sql a la ruta de clase funciona muy bien cheques, hbm2ddl si existe el archivo y lo ejecuta. El único detalle adicional es que cada comando SQL debe estar en su propia línea, de lo contrario no será capaz de ejecutar.
Esto también funciona sólo si se ajusta a hbm2ddl.auto
create
o create-drop
.
Añadir propiedad de hibernación hibernate.hbm2ddl. import_files en su configuración de hibernación. Cambiar hibernate.hbm2ddl.auto propiedad para crear. Añadir initial_data.sql en el directorio / clases con el código SQL para insertar datos inicial. Hibernate ejecutar esto después de crear el esquema de base de datos.
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.hbm2ddl.auto">create</prop>
<prop key="hibernate.hbm2ddl.import_files">initial_data.sql</prop>
</props>
</property>
</bean>
Si no desea añadir una propiedad en su configuración de hibernación puede crear un archivo en el directorio import.sql / clases e hibernación uso esto por defecto si hibernate.hbm2ddl.auto propiedad es igual para crear
Por qué hbm2ddl.auto
y hbm2ddl.import_files
las propiedades son demonio
(Cuando se utiliza incorrectamente como herramienta para la gestión de cambios de bases de datos)
como dije en otra parte, usando hibernate.hbm2ddl.auto
y hibernate.hbm2ddl.import_files
para la gestión de cambios de bases de datos tiene algunos grave desventajas:
- Sólo se puede cambiar la estructura.Los valores existentes pueden sobrescribirse o, en el peor de los casos, simplemente enviarse a Nirvana.Sin una herramienta como liquibase o scriptella, No tienes ninguno ETL capacidades.
- Este método no tiene transacciones.Tanto la estructura como las declaraciones de datos se ejecutarán antes de que un administrador de transacciones asuma el control.Digamos que tiene un error en el enunciado 42 de 256.Su base de datos ahora se encuentra en un estado inconsistente.
- En mi opinión, pierdes transparencia y control:donde un script scriptella o un cambio de liquibase se establecen o generalmente se confirman junto con los cambios en los modelos de dominio, se realiza un cambio en el modelo de dominio y se espera (básicamente) que hibernación descubra qué hacer.(No es así, pero esa es una historia diferente).
- Para la integración, el sistema y la prueba de aceptación, simplemente asumir que sus bases de datos de prueba estén en el absolutamente, exactamente el mismo estado como su base de datos de producción.Tienes que realizar un seguimiento de eso manualmente (¡Buena suerte y diviértete!;) ).En caso de cometer un error, basta con un pequeño desliz, los resultados pueden ser muy catastróficos.
Yo personalmente uso 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 lanzamiento
- Crear un registro de cambios de mi última base de datos
- A mano diff ambos registros de cambios (normalmente los cambios no son tan grandes y, si lo son, normalmente cumplen con una de las deficiencias de diferencia de liquibases dominio.
- crear un conjunto de cambios
Incluso para cambios complicados en los que hay que implementar una personalizadoCambiar, esto se puede lograr en cuestión de horas, incluida la definición de reversiones, 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 tienes la tranquilidad de haber hecho todo lo posible para mantener la base de datos en un estado consistente.
Después de un par de horas de tropiezo con esto, decidí compartir lo que he encontrado, aunque es un post muy antigua.
Para hacer que funcione correctamente, lo que tenía que hacer lo siguiente:
-
hbmddl
set acreate
ocreate-drop
- file.sql en la raíz de la ruta de clases; en mi caso, acabo de poner en
resources
carpeta, estoy usando experto. - cada comando SQL en una línea
- cada file.sql debe tener una línea en blanco al beggining del archivo ==> no saber la razón de esto, pero si no lo introduzca esa línea en blanco, por lo el tiempo de ejecución de los servidores me dice que hay un error de sintaxis cerca del primer carácter.
Espero que ayude.
Por favor asegúrese de que su import.sql tiene el formato correcto. Comience con una instrucción de inserción de un revestimiento a prueba.