¿Cómo funciona exactamente la propiedad spring.jpa.hibernate.ddl-auto en Spring?

Resuelto METTAIBI asked hace 7 años • 5 respuestas

Estaba trabajando en mi proyecto de aplicación Spring Boot y noté que, a veces, hay un error de tiempo de espera de conexión a mi base de datos en otro servidor (SQL Server). Esto sucede especialmente cuando intento realizar alguna migración de script conFlyWay pero funciona después de varios intentos.

Luego noté que no lo había especificado spring.jpa.hibernate.ddl-autoen mi archivo de propiedades. Investigué un poco y descubrí que se recomienda agregarlo spring.jpa.hibernate.ddl-auto= create-dropen desarrollo. Y cámbielo a:spring.jpa.hibernate.ddl-auto= none en producción.

Pero en realidad no entendí cómo funciona realmente y cómo hibernación genera el esquema de la base de datos usando create-dropo nonevalor. ¿Puede explicar técnicamente cómo funciona realmente y cuáles son las recomendaciones para usar esta propiedad en desarrollo y en un servidor de producción? Gracias

METTAIBI avatar Feb 09 '17 18:02 METTAIBI
Aceptado

Para que conste, la spring.jpa.hibernate.ddl-autopropiedad es específica de Spring Data JPA y es su forma de especificar un valor que eventualmente se pasará a Hibernate bajo la propiedad que conoce hibernate.hbm2ddl.auto.

Los valores create,, y básicamente influyen en cómo la administración de create-dropla herramienta de esquema manipulará el esquema de la base de datos al inicio.validateupdate

Por ejemplo, la updateoperación consultará la API del controlador JDBC para obtener los metadatos de la base de datos y luego Hibernate comparará el modelo de objetos que crea basándose en la lectura de sus clases anotadas o asignaciones XML de HBM e intentará ajustar el esquema sobre la marcha.

La updateoperación, por ejemplo, intentará agregar nuevas columnas, restricciones, etc., pero nunca eliminará una columna o restricción que pudo haber existido anteriormente pero que ya no forma parte del modelo de objetos de una ejecución anterior.

Por lo general, en escenarios de casos de prueba, probablemente lo usará create-droppara crear su esquema, su caso de prueba agrega algunos datos simulados, ejecuta sus pruebas y luego, durante la limpieza del caso de prueba, los objetos del esquema se eliminan, dejando una base de datos vacía.

En el desarrollo, a menudo es común ver que los desarrolladores updatemodifican automáticamente el esquema para agregar nuevas adiciones al reiniciar. Pero comprenda nuevamente que esto no elimina una columna o restricción que pueda existir en ejecuciones anteriores y que ya no sea necesaria.

En producción, a menudo se recomienda encarecidamente utilizar noneo simplemente no especificar esta propiedad. Esto se debe a que es una práctica común que los administradores de bases de datos revisen los scripts de migración para detectar cambios en la base de datos, especialmente si su base de datos se comparte entre múltiples servicios y aplicaciones.

Naros avatar Feb 09 '2017 22:02 Naros

En Spring/Spring-Boot, la base de datos SQL se puede inicializar de diferentes maneras dependiendo de cuál sea su pila.

JPA tiene funciones para la generación de DDL y se pueden configurar para que se ejecuten al inicio en la base de datos. Esto se controla a través de dos propiedades externas:

  • spring.jpa.generate-ddl(booleano) activa y desactiva la función y es independiente del proveedor.
  • spring.jpa.hibernate.ddl-auto(enum) es una característica de Hibernación que controla el comportamiento de una manera más detallada. Consulte a continuación para obtener más detalles.

Los valores de las propiedades de Hibernación son: crear, actualizar, crear-eliminar, validar y ninguno:

  • crear: Hibernar primero elimina las tablas existentes y luego crea tablas nuevas.
  • actualización: el modelo de objetos creado en función de las asignaciones (anotaciones o XML) se compara con el esquema existente y luego Hibernate actualiza el esquema de acuerdo con la diferencia. Nunca elimina las tablas o columnas existentes, incluso si la aplicación ya no las requiere.
  • create-drop: similar a create, con la adición de que Hibernate eliminará la base de datos después de que se completen todas las operaciones. Normalmente se utiliza para pruebas unitarias.
  • validar: Hibernar solo valida si las tablas y columnas existen; de lo contrario, genera una excepción.
  • ninguno: este valor desactiva efectivamente la generación de DDL

Spring Boot establece internamente de forma predeterminada el valor de este parámetro en create-drop si no se ha detectado ningún administrador de esquema; de lo contrario, ninguno en todos los demás casos.

MK Habib avatar Mar 23 '2021 09:03 MK Habib

También dependiendo de spring.jpa.hibernate.ddl-autola función de archivos DML está habilitada

DDL y DML

Vale la pena entender la diferencia entre ellos.

  • Lenguaje de definición de datos (DDL) : relacionado con la creación de esquemas de bases de datos
  • Lenguaje de manipulación de datos (DML) : relacionado con la importación de datos

Básicamente, existen 3 tipos de creación de esquemas de bases de datos (DDL) e importación de datos (DML):

  • Usando Hibernar
  • Usando scripts SQL de Spring JDBC
  • Usando herramientas de alto nivel como Flyway/Liquibase

Este tema cubre Hibernate y su DDL (primera opción), pero vale la pena mencionar la función de archivos DML de Hibernate que habilita si spring.jpa.hibernate.ddl-autoes createocreate-drop

Eso significa que import.sqlen la raíz del classpath será ejecutado al inicio por Hibernate. Esto puede ser útil para demostraciones y pruebas si tiene cuidado, pero probablemente no sea algo que desee que esté en el classpath en producción. Es una función de Hibernación (nada que ver con Spring).

También aquí hay una tabla que explica spring.jpa.hibernate.ddl-autosi se import.sqlpuede utilizar según spring.jpa.hibernate.ddl-autoel valor especificado:

spring.jpa.hibernate.ddl-auto Crear esquema a partir de entidades importar.sql
crear verdadero verdadero
actualizar actualizar esquema de entidades FALSO
crear-soltar verdadero verdadero
validar FALSO FALSO
ninguno FALSO FALSO

También se puede encontrar información adicional sobre los diferentes tipos de DDL y DML en los documentos de Spring.

kerbermeister avatar Feb 14 '2023 22:02 kerbermeister

Para la propiedad de JPA/Hibernate, el valor spring.jpa.hibernate.ddl-auto debe ser crear, actualizar, crear y soltar, no más, dará una excepción, donde el significado correcto para estos valores:

  • Crear : cuando el servidor se inicie, todas las entidades se crearán nuevamente

  • Actualización : cuando el servidor inicie, el contenedor encontrará qué entidades se han actualizado y cuáles se han creado recientemente. Lo mismo sucederá dentro de la base de datos y la tabla anterior se actualizará según la entidad y se creará la nueva tabla.

  • Crear-soltar : cuando el servidor se inicie, se crearán automáticamente todas las entidades y cuando el servidor se detenga, todas las entidades se eliminarán automáticamente de la base de datos.

  • none : significa que el ddl de la base de datos no afectará la aplicación back-end. Nota : el entorno de producción siempre está configurado con ningún valor

Lalit Sati avatar Jan 25 '2023 01:01 Lalit Sati