Realmente quiero saber más sobre la actualización, la exportación y los valores que se hibernate.hbm2ddl.auto
me pueden dar . Necesito saber cuándo usar la actualización y cuándo no. ¿Y cuál es la alternativa?
Estos son cambios que podrían ocurrir en DB:
- nuevas mesas
- nuevas columnas en tablas antiguas
- columnas eliminadas
- tipo de datos de una columna modificada
- un tipo de columna cambió sus atributos
- mesas caídas
- valores de una columna cambiados
En cada caso, ¿cuál es la mejor solución?
También existe el valor no documentado de "ninguno" para deshabilitarlo por completo.
fuente
La propiedad de configuración se llama
hibernate.hbm2ddl.auto
En nuestro entorno de desarrollo, establecemos
hibernate.hbm2ddl.auto=create-drop
colocar y crear una base de datos limpia cada vez que implementamos, de modo que nuestra base de datos esté en un estado conocido.En teoría, puede configurar
hibernate.hbm2ddl.auto=update
para actualizar su base de datos con cambios en su modelo, pero no confiaría en eso en una base de datos de producción. Una versión anterior de la documentación decía que esto era experimental, al menos; No sé el estado actual.Por lo tanto, para nuestra base de datos de producción, no establezca
hibernate.hbm2ddl.auto
, el valor predeterminado es no realizar cambios en la base de datos. En su lugar, creamos manualmente un script de actualización DDL de SQL que aplica los cambios de una versión a la siguiente.fuente
Me gustaría utilizar Liquibase para la actualización de su base de datos. La función de actualización de esquema de hibernate solo está bien para un desarrollador mientras está desarrollando nuevas funciones. En una situación de producción, la actualización de db debe manejarse con más cuidado.
fuente
Aunque es una publicación bastante antigua, pero como hice una investigación sobre el tema, pensé en compartirlo.
hibernate.hbm2ddl.auto
Según la documentación, puede tener cuatro valores válidos:
crear | actualización | validar | crear-soltar
A continuación se explica el comportamiento que muestran estos valores:
Los siguientes son los puntos importantes que vale la pena señalar:
Table not found:<table name>
En caso de que le dé algún valor a esta propiedad (digamos abc, en lugar de los cuatro valores mencionados anteriormente) o simplemente se deja en blanco. Muestra el siguiente comportamiento:
-Si el esquema no está presente en la base de datos: - Crea el esquema
-Si el esquema está presente en la base de datos: - actualice el esquema.
fuente
Primero, los valores posibles para la
hbm2ddl
propiedad de configuración son los siguientes:none
- No se realiza ninguna acción. El esquema no se generará.create-only
- Se generará el esquema de la base de datos.drop
- El esquema de la base de datos se descartará y se creará después.create
- El esquema de la base de datos se descartará y se creará después.create-drop
- El esquema de la base de datos se descartará y se creará después. Al cerrar elSessionFactory
, se eliminará el esquema de la base de datos.validate
- El esquema de la base de datos se validará utilizando las asignaciones de entidades.update
- El esquema de la base de datos se actualizará comparando el esquema de la base de datos existente con las asignaciones de entidades.Dediqué una publicación de blog a las estrategias de generación DDL de Hibernate más comunes :
hibernate.hbm2ddl.auto="update"
es conveniente pero menos flexible si usted planea en la adición de funciones o ejecutar algunos scripts personalizados.Sin embargo, incluso si usa Flyway, puede generar el script de migración inicial usando hbm2ddl. En este artículo , puede ver cómo puede combinar el modelo de entidad JPA con el modelo de tabla jOOQ.
fuente
hibernate.hbm2ddl.auto
valida y exporta automáticamente DDL al esquema cuando se crea sessionFactory.Por defecto, no realiza ninguna creación o modificación automáticamente en la base de datos. Si el usuario establece uno de los valores a continuación, está realizando cambios de esquema DDL automáticamente.
crear - haciendo crear un esquema
actualizar: actualizar el esquema existente
validar - validar el esquema existente
create-drop: crea y suelta el esquema automáticamente cuando se inicia y finaliza una sesión
fuente
Si no desea utilizar cadenas en su aplicación y está buscando constantes predefinidas, eche un vistazo a la
org.hibernate.cfg.AvailableSettings
clase incluida en el JAR de Hibernate, donde encontrará una constante para todas las configuraciones posibles. En su caso, por ejemplo:fuente
validate
: valida el esquema, no ocurre ningún cambio en la base de datos.update
: actualiza el esquema con la consulta de ejecución actual.create
: crea un nuevo esquema cada vez y destruye los datos anteriores.create-drop
: elimina el esquema cuando la aplicación se detiene o SessionFactory se cierra explícitamente.fuente
Creo que deberías concentrarte en
esta clase hace que su configuración sea dinámica, por lo que le permite elegir las suites que prefiera ...
Pagar [SchemaExport]
fuente
validate
: Valida el esquema y no realiza cambios en la base de datos.Suponga que ha agregado una nueva columna en el archivo de mapeo y realiza la operación de inserción, arrojará una excepción "falta la columna XYZ" porque el esquema existente es diferente del objeto que va a insertar. Si modifica la tabla agregando esa nueva columna manualmente y luego realiza la operación Insertar, definitivamente insertará todas las columnas junto con la nueva columna en la Tabla. Significa que no hace ningún cambio / altera el esquema / tabla existente.
update
: altera la tabla existente en la base de datos cuando realiza la operación. Puede agregar o eliminar columnas con esta opción de hbm2ddl. Pero si va a agregar una nueva columna que 'NO ES NULA', ignorará agregar esa columna en particular a la base de datos. Porque la tabla debe estar vacía si desea agregar una columna 'NO NULL' a la tabla existente.fuente
Desde 5.0 , ahora puede encontrar esos valores en un dedicado
Enum
:org.hibernate.boot.SchemaAutoTooling
(mejorado con valorNONE
desde 5.2).O incluso mejor, desde 5.1 , también puede utilizar el que combina JPA 2 y acciones "heredadas" Hibernate DDL.
org.hibernate.tool.schema.Action
Enum
Pero , aún no puede configurar una
DataSource
programación mediante esto. Sería mejor usar esto combinado con,org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO
pero el código actual espera unString
valor (extracto tomado deSessionFactoryBuilderImpl
):... y
enum
valores internos de ambosorg.hibernate.boot.SchemaAutoTooling
yorg.hibernate.tool.schema.Action
no están expuestos públicamente.A continuación, una
DataSource
configuración programática de muestra (utilizada en una de mis aplicaciones Spring Boot) que utiliza un gambito gracias a,.name().toLowerCase()
pero solo funciona con valores sin guión (no,create-drop
por ejemplo):fuente
A quien busca el valor predeterminado ...
Está escrito en el código fuente en la versión 2.0.5 de spring-boot y 1.1.0 en JpaProperties:
fuente