¿Cómo funciona exactamente la propiedad spring.jpa.hibernate.ddl-auto en Spring?
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-auto
en mi archivo de propiedades. Investigué un poco y descubrí que se recomienda agregarlo
spring.jpa.hibernate.ddl-auto= create-drop
en 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-drop
o none
valor. ¿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
Para que conste, la spring.jpa.hibernate.ddl-auto
propiedad 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-drop
la herramienta de esquema manipulará el esquema de la base de datos al inicio.validate
update
Por ejemplo, la update
operació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 update
operació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-drop
para 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 update
modifican 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 none
o 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.
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.
También dependiendo de spring.jpa.hibernate.ddl-auto
la 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-auto
es create
ocreate-drop
Eso significa que import.sql
en 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-auto
si se import.sql
puede utilizar según spring.jpa.hibernate.ddl-auto
el 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.
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