Hibernar: hbm2ddl.auto=¿actualización en producción?
¿Está bien ejecutar aplicaciones de Hibernate configuradas hbm2ddl.auto=update
para actualizar el esquema de la base de datos en un entorno de producción?
No, no es seguro.
A pesar de los mejores esfuerzos del equipo de Hibernate, simplemente no se puede confiar en las actualizaciones automáticas en producción . Escriba sus propios parches, revíselos con DBA, pruébelos y luego aplíquelos manualmente.
En teoría, si la actualización hbm2ddl funcionó en desarrollo, también debería funcionar en producción. Pero en realidad, no siempre es así.
Incluso si funcionó bien, puede que no sea óptimo. A los DBA se les paga tanto por una razón.
Lo hacemos en producción, aunque con una aplicación que no es de misión crítica y sin administradores de bases de datos altamente remunerados en el personal. Es solo un proceso manual menos que está sujeto a errores humanos: la aplicación puede detectar la diferencia y hacer lo correcto, además, presumiblemente, la ha probado en varios entornos de desarrollo y prueba.
Una advertencia: en un entorno agrupado es posible que desee evitarlo porque pueden aparecer varias aplicaciones al mismo tiempo e intentar modificar el esquema, lo que podría ser malo. O instale algún mecanismo donde solo se permita una instancia para actualizar el esquema.
Los creadores de Hibernate desaconsejan hacerlo en un entorno de producción en su libro "Java Persistence with Hibernate" :
ADVERTENCIA: Hemos visto usuarios de Hibernate intentando utilizar SchemaUpdate para actualizar automáticamente el esquema de una base de datos de producción. Esto puede terminar rápidamente en un desastre y su DBA no lo permitirá.
Hibernate tiene que poner el descargo de responsabilidad sobre no usar actualizaciones automáticas para cubrirse cuando las personas que no saben lo que están haciendo las usan en situaciones en las que no deberían usarse.
Es cierto que las situaciones en las que no debería usarse superan en gran medida a aquellas en las que está bien.
Lo he usado durante años en muchos proyectos diferentes y nunca he tenido ningún problema. Esa no es una respuesta tonta y no es codificación de vaqueros. Es un hecho histórico.
Una persona que dice "nunca lo hagas en producción" está pensando en un conjunto específico de implementaciones de producción, es decir, aquellas que conoce (su empresa, su industria, etc.).
El universo de los "despliegues de producción" es vasto y variado.
Un desarrollador experimentado de Hibernate sabe exactamente qué DDL resultará de una configuración de mapeo determinada. Siempre que pruebe y valide que lo que espera termine en el DDL (en desarrollo, control de calidad, preparación, etc.), estará bien.
Cuando agrega muchas funciones, las actualizaciones automáticas de esquemas pueden ahorrarle mucho tiempo.
La lista de cosas que las actualizaciones automáticas no manejarán es interminable, pero algunos ejemplos son la migración de datos, la adición de columnas que no aceptan valores NULL, cambios de nombre de columna, etc., etc.
También hay que tener cuidado en entornos agrupados.
Pero claro, si supieras todo esto, no harías esta pregunta. Mmm . . . Bien, si hace esta pregunta, debe esperar hasta tener mucha experiencia con Hibernate y actualizaciones automáticas de esquemas antes de pensar en usarlo en prod.