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

1085

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?

Vlad Mihalcea
fuente

Respuestas:

1083

De la documentación de la comunidad :

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 son,

  • validar : valida el esquema, no realiza cambios en la base de datos.
  • actualizar : actualiza el esquema.
  • crear : crea el esquema, destruyendo datos anteriores.
  • create-drop : suelta el esquema cuando SessionFactory se cierra explícitamente, generalmente cuando se detiene la aplicación.
  • none : no hace nada con el esquema, no realiza cambios en la base de datos

Estas opciones parecen ser herramientas para desarrolladores y no para facilitar ninguna base de datos de nivel de producción, es posible que desee echar un vistazo a la siguiente pregunta; Hibernate: hbm2ddl.auto = ¿actualización en producción?

James McMahon
fuente
14
Simplemente lea el documento de hibernación ... para conocer los valores válidos, dice: "por ejemplo" ... ¿hay otros valores válidos?
Ta Sas
16
Creo que dice "por ejemplo" 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/…
szegedi
44
validar dice validar el esquema, ¿qué significa exactamente?
Hussain Akhtar Wahid 'Ghouri'
66
También puede usar 'oso hormiguero', 'paloma' o cualquier otra palabra, si desea que hibernate no haga nada. ¡No es que lo recomendaría, por supuesto!
Ward
2
Una pequeña adición a la opción crear-soltar. 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 el esquema S tiene tablas A, B, C y el código java tiene asignaciones para A y B, entonces Hibernate no eliminará la tabla C.
Aditya
194

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

Michiel Verkaik
fuente
77
En realidad, esto es bastante útil ya que la validación del esquema de Hibernate a veces falla para esquemas perfectamente válidos.
Michael Piefel
Estaba a punto de pedir algo como esto. Mi intención es reducir el tiempo de inicio.
digao_mb
46
'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
okwap
14
Lo he parchado. Se agregó "none" como una constante explícitamente válida.
Sanne
99
Me gusta "hibernate.hbm2ddl.auto = potato" sobre otros stackoverflow.com/a/15810379/838444
Sneg
161

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

En nuestro entorno de desarrollo, establecemos hibernate.hbm2ddl.auto=create-dropcolocar 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=updatepara 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.

Peter Hilton
fuente
55
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. No , no eliminar las tablas cuando se crea la fábrica de sesiones.
Frans
44
No, tanto create-drop como create drop las tablas cuando se crea la sessionfactory, luego create-drop elimina las tablas también cuando sessionfactory está cerrado. Ver stackoverflow.com/a/6752698/1536382
Testo Testini el
¿hacer hibernate.hbm2ddl.auto = create-drop en producción puede provocar varios tiempos de espera de conexión en producción?
METTAIBI
51

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.

Palmadita
fuente
66
Consulte stackoverflow.com/questions/221379/… para saber por qué no debe usar hbm2ddl para la producción.
Nathan Voxland el
51

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:

  • crear : crea el esquema, los datos previamente presentes (si hay) en el esquema se pierden
  • actualizar: actualiza el esquema con los valores dados.
  • validar: - validar el esquema. No hace ningún cambio en el DB.
  • create-drop: crea el esquema con la destrucción de los datos previamente presentes (si los hay). También descarta el esquema de la base de datos cuando SessionFactory está cerrado.

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, entonces se crea el esquema.
  • En caso de validación , si el esquema no existe en DB, no se crea. En cambio, arrojará un error: -Table not found:<table name>
  • En caso de crear-soltar , el esquema no se cae al cerrar la sesión. Solo cae al cerrar la 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: - actualice el esquema.

amit
fuente
De hecho, es un punto muy importante que el esquema se creará si no existe, cuando se utiliza "actualizar".
yuranos
create-drop se contradice cuando se comparan las declaraciones "Explicación del comportamiento" y "Puntos importantes".
VNT
2
¿Cuál es la diferencia entre actualizar y vaciar ?
yashjain12yj
46

Primero, los valores posibles para la hbm2ddlpropiedad 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 el SessionFactory, 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 :

  1. El hibernate.hbm2ddl.auto="update"es conveniente pero menos flexible si usted planea en la adición de funciones o ejecutar algunos scripts personalizados.
  2. El enfoque más flexible es usar Flyway .

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.

Vlad Mihalcea
fuente
27

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

    <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">
Vinod Kumawat
fuente
2
¿qué pasa con <entry key = "hibernate.hbm2ddl.auto" value = "none">?
VNT
17

Si no desea utilizar cadenas en su aplicación y está buscando constantes predefinidas, eche un vistazo a la org.hibernate.cfg.AvailableSettingsclase 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";
Stefan Haberl
fuente
55
¿Por qué hay una referencia al archivo fuente de más de 700 líneas sobre la respuesta directa con casi 500 vole ups?
Pavel Niedoba
... esa pregunta no tiene ningún sentido. ¿Por qué hay cosas? ¿Por que estoy aqui?
specializt
8
  • 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.
vishal thakur
fuente
¿Cuál es la referencia de documentación 'oficial'? - Me pregunto ...
Dirk Schumacher
7

Creo que deberías concentrarte en

SchemaExport Class 

esta clase hace que su configuración sea dinámica, por lo que le permite elegir las suites que prefiera ...

Pagar [SchemaExport]

Vishal Sharma
fuente
4

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.

Arun Raaj
fuente
3

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 DataSourceprogramación mediante esto. Sería mejor usar esto combinado con, org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTOpero el código actual espera un Stringvalor (extracto tomado de SessionFactoryBuilderImpl):

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

... y enumvalores internos de ambos org.hibernate.boot.SchemaAutoToolingy org.hibernate.tool.schema.Actionno están expuestos públicamente.

A continuación, una DataSourceconfiguració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-droppor 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();
}
Doc Davluz
fuente
0

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:

    /**
     * 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;
ibrahim demir
fuente