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

129

Estaba trabajando en mi proyecto de aplicación de arranque Spring 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 una migración de scripts, FlyWaypero funciona después de varios intentos.

Entonces noté que no lo especifiqué spring.jpa.hibernate.ddl-autoen mi archivo de propiedades. Investigué un poco y descubrí que se recomienda agregar spring.jpa.hibernate.ddl-auto= create-dropen desarrollo. Y cámbielo a: spring.jpa.hibernate.ddl-auto= noneen producción.

Pero en realidad no entendí cómo funciona realmente y cómo hibernate genera un esquema de 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 el desarrollo y en un servidor de producción? Gracias

METTAIBI
fuente
1
FWIW JPA 2.1 tiene una propiedad estándar javax.persistence.schema-generation.database.action, por lo que realmente no ve la necesidad de usar propiedades específicas del proveedor de JPA para la generación de esquemas.
Neil Stockton
@NeilStockton Una idea que estamos explorando con Hibernate 6 es la capacidad de poder controlar la generación de esquemas de manera diferente según las categorías; por ejemplo, sus tablas de orm pueden serlo, nonepero es posible que desee que sus tablas de búsqueda de Hibernate y Envers se generen utilizando, updateya que esos proyectos las administran internamente y no desea administrarlas manualmente usted mismo. En este momento controlamos esto globalmente para todas las tablas, independientemente de su origen / fuente. Esta sería una razón más para usar opciones específicas del proveedor si quisiera usar esto.
Naros

Respuestas:

215

Para el registro, la spring.jpa.hibernate.ddl-autopropiedad es la primavera de datos JPA específico y es su forma de especificar un valor que con el tiempo se pasó a Hibernate bajo la propiedad se sabe, hibernate.hbm2ddl.auto.

Los valores create, create-drop, validate, y update, básicamente, influyen en cómo la gestión de herramientas esquema manipulará el esquema de base de datos en el inicio.

Por ejemplo, la updateoperación consultará la API del controlador JDBC para obtener los metadatos de la base de datos y luego Hibernate compara el modelo de objeto 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 puede haber existido anteriormente pero que ya no forma parte del modelo de objeto de una ejecución anterior.

Por lo general, en los escenarios de casos de prueba, es probable create-dropque lo use 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 de esquema se eliminan, dejando una base de datos vacía.

En desarrollo, a menudo es común ver que los desarrolladores updatemodifican automáticamente el esquema para agregar nuevas adiciones al reiniciar. Pero, nuevamente, comprenda que esto no elimina una columna o restricción que pueda existir de ejecuciones anteriores 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 varios servicios y aplicaciones.

Naros
fuente
11
Sí, nunca use la generación de ddl en producción. Generamos los scripts iniciales para la estructura de la tabla usando ddl e involucramos al DBA en el proceso. Luego incluimos los scripts db como parte de la unidad de implementación y los ejecutamos usando Flyway cuando se implementa la aplicación. Cuando necesitamos modificar la base de datos, agregamos nuevos scripts a la próxima versión de la aplicación y los implementamos en la etapa de pruebas. Flyway detectará automáticamente la versión actual y ejecutará los scripts necesarios para llevar la base de datos a la versión más reciente. Si todo funciona, lo implementamos en producción.
Klaus Groenbaek
1
¿Qué pasa si no especificamos esta propiedad? por ejemplo, tengo mi propia <bean id = "sessionFactory" class = "org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ... <prop key = "hibernate.hbm2ddl.auto"> actualización </prop> Tuve esto y por alguna razón mis tablas siempre se cayeron, hasta que agregué la propiedad mencionada anteriormente ;; ps: perdón por el código de muestra)
Ţîgan Ion
11
¿Por qué no validateen Production Env?
Shamal Karunarathne
20
@ShamalKarunarathne Las aplicaciones se pueden usar validateen producción, pero normalmente esa debe ser una configuración que use en su entorno de calidad / prueba para verificar que los scripts de base de datos que ha escrito o aplicado a su herramienta de migración de base de datos sean precisos. Otra razón para no usar validateen producción es que podría ser un cuello de botella durante el proceso de inicio de su aplicación, particularmente si su modelo de objeto tiene un tamaño bastante extenso o si entran en juego otros factores relacionados con la red.
Naros
1
Sin un rastro de pila preciso, es difícil especular; sin embargo, mi primera suposición sería que orderel analizador SQL está interpretando incorrectamente, ya que es una palabra clave si no se escapa.
Naros