¿Cuáles son los valores posibles de la configuración hbm2ddl.auto de Hibernate y qué hacen?

Realmente quiero saber más sobre la actualización, la exportación y los valores que se le podrían dar a hibernate.hbm2ddl.auto
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 tablas
  • columnas nuevas en tablas antiguas
  • columnas eliminadas
  • el tipo de datos de una columna ha cambiado
  • 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?

preguntado el 13 de enero de 09 a las 04:01

13 Respuestas

Desde el documentación comunitaria:

hibernate.hbm2ddl.auto Valida o exporta automáticamente el esquema DDL a la base de datos cuando se crea SessionFactory. Con create-drop, el esquema de la base de datos se eliminará cuando SessionFactory se cierre explícitamente.

por ejemplo, validar | actualización | crear | crear-soltar

Entonces, la lista de posibles opciones es,

  • validar: valida el esquema, no realiza cambios en la base de datos.
  • actualización: actualiza el esquema.
  • Para crear: crea el esquema, destruyendo los datos anteriores.
  • crear-soltar: elimine el esquema cuando SessionFactory se cierra explícitamente, normalmente cuando se detiene la aplicación.
  • ninguna: no hace nada con el esquema, no hace cambios en la base de datos

Estas opciones parecen estar destinadas a ser herramientas de desarrollo y no a facilitar ninguna base de datos de nivel de producción, es posible que desee ver la siguiente pregunta; Hibernate: hbm2ddl.auto = ¿actualizar en producción?

Respondido el 20 de junio de 20 a las 10:06

Simplemente lea el documento de hibernación ... para valores válidos, dice: "por ejemplo" ... ¿hay otros valores válidos? - Ta Sas

Creo que dice "eg" porque es solo una documentación de la comunidad, si alguien está interesado en todos los valores posibles, se puede encontrar en el javadoc de Hibernate. (Y sí, solo esas cuatro opciones están presentes) docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/cfg/… - de Szeged

validar dice validar el esquema, ¿qué significa exactamente? - Hussain Akhtar Wahid 'Ghouri'

También puedes usar 'oso hormiguero', 'paloma' o cualquier otra palabra, si quieres que hibernar no haga nada. ¡No es que lo recomiende, por supuesto! - Sala

Una pequeña adición a la opción Create-Drop. Si se utiliza esta opción, no elimina todo el esquema, sino que elimina las tablas cuyas asignaciones están disponibles mientras se ejecuta. Por ejemplo, si una base de datos con Schema S tiene tablas A, B, C y el código Java tiene asignaciones para A y B solo, Hibernate no eliminará la tabla C. Aditya

También existe el valor indocumentado de "ninguno" para deshabilitarlo por completo.

Respondido el 08 de junio de 12 a las 15:06

En realidad, esto es bastante útil ya que la validación de esquemas de Hibernate a veces falla para esquemas perfectamente válidos. - miguel piefel

Estaba a punto de pedir algo como esto. Mi intención es reducir el tiempo de inicio. - digao_mb

'cadena vacía' es mejor que 'ninguno'. Para usar 'none', recibirá un mensaje de advertencia: org.hibernate.cfg.SettingsFactory - Valor no reconocido para "hibernate.hbm2ddl.auto": none - petertac

Lo he parcheado. Se agregó "ninguno" como una constante explícitamente válida. - Sanne

Me gusta "hibernate.hbm2ddl.auto = potato" sobre otros stackoverflow.com/a/15810379/838444 - Nieve

La propiedad de configuración se llama hibernate.hbm2ddl.auto

En nuestro entorno de desarrollo establecemos hibernate.hbm2ddl.auto=create-drop para eliminar 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 conozco 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 SQL DDL que aplica los cambios de una versión a la siguiente.

Respondido el 13 de enero de 09 a las 08:01

En realidad, según la documentación, create-drop crea las tablas de la base de datos y las elimina cuando la fábrica de sesiones se cierra explícitamente. Lo hace no eliminar las tablas cuando se crea la fábrica de sesiones. - francés

No, tanto create-drop como create descartan las tablas cuando se crea sessionfactory, luego create-drop descarta las tablas también cuando se cierra sessionfactory. Ver stackoverflow.com/a/6752698/1536382 - Testo Testini

¿Hacer hibernate.hbm2ddl.auto = create-drop en producción puede llevar a varios tiempos de espera de conexión en producción? - METTAIBI

Primero, los posibles valores para el hbm2ddl propiedad de configuración son las siguientes:

  • none - No se realiza ninguna acción. No se generará el esquema.
  • create-only - Se generará el esquema de la base de datos.
  • drop - Se eliminará el esquema de la base de datos.
  • create - El esquema de la base de datos se eliminará y se creará posteriormente.
  • create-drop - El esquema de la base de datos se eliminará y se creará posteriormente. Al cerrar el SessionFactory, se eliminará el esquema de la base de datos.
  • validate - El esquema de la base de datos se validará mediante 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.

Los programas hibernate.hbm2ddl.auto="update" es conveniente pero menos flexible si planea agregar funciones o ejecutar algunos scripts personalizados.

Entonces el enfoque más flexible es utilizar Flyway.

Sin embargo, incluso si usa Flyway, aún puede generar el script de migración inicial usando hbm2ddl.

Respondido el 10 de enero de 21 a las 06:01

drop no parece ser una opción válida. ¿A qué versión de hibernación te refieres? - xagaffar

Ha sido una opción válida desde Hibernate 5.1, que se lanzó en 2016. Consulte el Action enum para más detalles. Supongo que está utilizando una versión de Hibernate muy antigua. - Vlad Mihalcea

yo usaría liquibase para actualizar su db. La función de actualización del esquema de hibernate solo está bien para un desarrollador mientras están desarrollando nuevas funciones. En una situación de producción, la actualización de la base de datos debe manejarse con más cuidado.

respondido 23 mar '09, 07:03

Ver stackoverflow.com/questions/221379/… por qué no debería usar hbm2ddl para la producción. - nathan voxland

Aunque es una publicación bastante antigua, como investigué un poco sobre el tema, pensé en compartirla.

hibernate.hbm2ddl.auto

Según la documentación, puede tener cuatro valores válidos:

crear | actualización | validar | crear-soltar

A continuación se muestra la explicación del comportamiento mostrado por estos valores:

  • Para crear : - crea el esquema, los datos previamente presentes (si los hay) en el esquema se pierden
  • actualizar: - actualiza el esquema con los valores dados.
  • validar: - validar el esquema. No hace ningún cambio en la base de datos.
  • create-drop: - crea el esquema destruyendo los datos previamente presentes (si los hay). También elimina el esquema de la base de datos cuando se cierra SessionFactory.

Los siguientes son los puntos importantes que vale la pena señalar:

  • En caso de actualización, si el esquema no está presente en la base de datos, se crea el esquema.
  • En caso de validar, si el esquema no existe en la base de datos, no se crea. En cambio, arrojará un error: - Table not found:<table name>
  • En caso de crear-soltar, el esquema no se descarta al cerrar la sesión. Solo cae al cerrar SessionFactory.
  • 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: - actualización el esquema.

Respondido 07 ago 16, 16:08

De hecho, es un punto muy importante que el esquema se creará si no existe, cuando se usa "actualizar". - yuranos

create-drop se contradice cuando se comparan las declaraciones de "Explicación del comportamiento" y "Puntos importantes". - VNT

Cuál es la diferencia entre actualización y vacío? - yashjain12yj

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 siguientes, entonces está haciendo cambios de esquema DDL automáticamente.

  • crear - hacer creando un esquema

    <entry key="hibernate.hbm2ddl.auto" value="create">
    
  • actualizar: actualizar el esquema existente

    <entry key="hibernate.hbm2ddl.auto" value="update">
    
  • validar - validar el esquema existente

    <entry key="hibernate.hbm2ddl.auto" value="validate">
    
  • create-drop: crea y suelta el esquema automáticamente cuando se inicia y finaliza una sesión

    <entry key="hibernate.hbm2ddl.auto" value="create-drop">
    

Respondido 10 Jul 17, 13:07

qué pasa ? - VNT

Si no desea utilizar cadenas en su aplicación y está buscando constantes predefinidas, eche un vistazo a 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:

/**
 * Auto export/update schema using hbm2ddl tool. Valid values are <tt>update</tt>,
 * <tt>create</tt>, <tt>create-drop</tt> and <tt>validate</tt>.
 */
String HBM2DDL_AUTO = "hibernate.hbm2ddl.auto";

Respondido el 08 de junio de 15 a las 11:06

¿Por qué se hace referencia a un archivo fuente de más de 700 líneas arriba de la respuesta directa con casi 500 topillos? - Pavel Niedoba

... esa pregunta no tiene ningún sentido. ¿Por qué hay cosas? ¿Por que estoy aqui? - especialización

  • 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.

Respondido 16 Abr '19, 21:04

¿Cuál es la referencia de documentación 'oficial'? - sólo me preguntaba... - dirk schumacher

Creo que deberías concentrarte en el

SchemaExport Class 

esta clase hace que su configuración sea dinámica, por lo que le permite elegir las suites que mejor se adapten a sus necesidades ...

Pagar [Exportación de esquema]

Respondido el 21 de junio de 12 a las 03:06

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 al 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 realiza 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 es 'NOT NULL', ignorará la adición de esa columna en particular a la base de datos. Porque la tabla debe estar vacía si desea agregar una columna 'NOT NULL' a la tabla existente.

Respondido 15 Oct 17, 15:10

Desde 5.0, ahora puede encontrar esos valores en un Enum: org.hibernate.boot.SchemaAutoTooling (mejorado con valor NONE desde 5.2).

O mejor, ya 5.1, también puedes usar el org.hibernate.tool.schema.Action Enum que combina JPA 2 y acciones DDL de Hibernate "heredadas".

Pero, todavía no puede configurar un DataSource programáticamente con esto. Sería mejor usar esto combinado con org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTO pero el código actual espera un String valor (extracto tomado de SessionFactoryBuilderImpl):

this.schemaAutoTooling = SchemaAutoTooling.interpret( (String) configurationSettings.get( AvailableSettings.HBM2DDL_AUTO ) );

… E interno enum valores de ambos org.hibernate.boot.SchemaAutoToolingy org.hibernate.tool.schema.Action no se exponen públicamente.

A continuación, una muestra de programática DataSource configuración (usada en algunas de mis aplicaciones Spring Boot) que usan un gambito gracias a .name().toLowerCase() pero solo funciona con valores sin guión (no create-drop por ejemplo):

@Bean(name = ENTITY_MANAGER_NAME)
public LocalContainerEntityManagerFactoryBean internalEntityManagerFactory(
        EntityManagerFactoryBuilder builder,
        @Qualifier(DATA_SOURCE_NAME) DataSource internalDataSource) {

    Map<String, Object> properties = new HashMap<>();
    properties.put(AvailableSettings.HBM2DDL_AUTO, SchemaAutoTooling.CREATE.name().toLowerCase());
    properties.put(AvailableSettings.DIALECT, H2Dialect.class.getName());

    return builder
            .dataSource(internalDataSource)
            .packages(JpaModelsScanEntry.class, Jsr310JpaConverters.class)
            .persistenceUnit(PERSISTENCE_UNIT_NAME)
            .properties(properties)
            .build();
}

Respondido 19 ago 16, 13:08

Para quien busque 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:

    /**
     * DDL mode. This is actually a shortcut for the "hibernate.hbm2ddl.auto"
     * property. Defaults to "create-drop" when using an embedded database and no
     * schema manager was detected. Otherwise, defaults to "none".
     */
    private String ddlAuto;

Respondido el 10 de diciembre de 20 a las 07:12

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.