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, FlyWay
pero funciona después de varios intentos.
Entonces noté que no lo especifiqué spring.jpa.hibernate.ddl-auto
en mi archivo de propiedades. Investigué un poco y descubrí que se recomienda agregar
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 hibernate genera un esquema de 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 el desarrollo y en un servidor de producción? Gracias
none
pero es posible que desee que sus tablas de búsqueda de Hibernate y Envers se generen utilizando,update
ya 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.Respuestas:
Para el registro, la
spring.jpa.hibernate.ddl-auto
propiedad 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
, yupdate
, 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
update
operació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
update
operació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-drop
que 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
update
modifican 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
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 varios servicios y aplicaciones.fuente
validate
en Production Env?validate
en 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 usarvalidate
en 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.order
el analizador SQL está interpretando incorrectamente, ya que es una palabra clave si no se escapa.