Каковы возможные значения конфигурации Hibernate hbm2ddl.auto и что они делают

Я действительно хочу узнать больше об обновлении, экспорте и значениях, которые могут быть даны. hibernate.hbm2ddl.auto
Мне нужно знать, когда использовать обновление, а когда нет? И какова альтернатива?

Это изменения, которые могут произойти в БД:

  • новые столы
  • новые столбцы в старых таблицах
  • столбцы удалены
  • тип данных столбца изменен
  • тип столбца изменил свои атрибуты
  • столы упали
  • значения столбца изменены

В каждом случае, что является лучшим решением?

13.01.2009 06:40:48
13 ОТВЕТОВ

Свойство конфигурации называется hibernate.hbm2ddl.auto

В нашей среде разработки мы собираемся hibernate.hbm2ddl.auto=create-dropудалять и создавать чистую базу данных при каждом развертывании, чтобы наша база данных находилась в известном состоянии.

Теоретически, вы можете настроить hibernate.hbm2ddl.auto=updateобновление базы данных с учетом изменений в вашей модели, но я бы не стал доверять этому в рабочей базе данных. В более ранней версии документации говорилось, что это, по крайней мере, экспериментально; Я не знаю текущий статус.

Поэтому для нашей производственной базы данных не устанавливайте hibernate.hbm2ddl.auto- по умолчанию не производится никаких изменений в базе данных. Вместо этого мы вручную создаем сценарий обновления SQL DDL, который применяет изменения от одной версии к другой.

161
13.01.2009 08:11:45
На самом деле, согласно документации, create-drop создает таблицы базы данных и удаляет их, когда фабрика сеансов явно закрыта. Он не удаляет таблицы при создании фабрики сеансов.
Frans 23.01.2014 09:30:50
Нет, как create-drop, так и create отбрасывают таблицы при создании фабричной сессии, затем create-drop удаляет таблицы и при закрытой фабричной сессии. См. Stackoverflow.com/a/6752698/1536382
Testo Testini 3.11.2015 10:54:41
Может ли создание hibernate.hbm2ddl.auto = create-drop в производственном процессе привести к нескольким тайм-аутам соединения в производственном процессе?
METTAIBI 9.02.2017 11:18:33

Я бы использовал liquibase для обновления вашей базы данных . Функция обновления схемы hibernate действительно подходит только для разработчиков, когда они разрабатывают новые функции. В производственной ситуации с обновлением БД нужно обращаться более осторожно.

51
23.03.2009 07:40:34
См stackoverflow.com/questions/221379/... , почему вы не должны использовать hbm2ddl для производства.
Nathan Voxland 4.11.2009 07:06:55

Из документации сообщества :

hibernate.hbm2ddl.auto Автоматически проверяет или экспортирует DDL схемы в базу данных при создании SessionFactory. С помощью create-drop схема базы данных будет удалена, когда SessionFactory закрывается явно.

например, проверить | обновление | создать | создание-падение

Итак, список возможных вариантов:

  • validate : проверяет схему, не вносит изменений в базу данных.
  • обновить : обновить схему.
  • create : создает схему, уничтожая предыдущие данные.
  • create-drop : удалить схему, когда SessionFactory закрывается явно, обычно, когда приложение остановлено.
  • none : ничего не делает со схемой, не вносит изменений в базу данных

Эти опции, похоже, предназначены для разработчиков, а не для облегчения работы с базами данных производственного уровня. Возможно, вы захотите взглянуть на следующий вопрос; Hibernate: hbm2ddl.auto = обновление в производстве?

1074
15.01.2020 11:04:32
Просто прочитайте документацию hibernate ... для правильных значений написано: "например" ... есть ли другие допустимые значения?
Ta Sas 10.07.2010 22:20:22
Я думаю, что он говорит «например», потому что это просто документация сообщества, если кто-то заинтересован во всех возможных значениях, его можно найти в Javadoc Hibernate. (И да, присутствуют только эти четыре варианта) docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/cfg/…
szegedi 20.09.2012 13:21:34
validate говорит валидация схемы, что именно это означает ??
Hussain Akhtar Wahid 'Ghouri' 18.09.2013 22:08:26
Вы также можете использовать «aardvark», «голубь» или любое другое слово, если вы хотите, чтобы hibernate ничего не делал. Не то, чтобы я рекомендовал бы это конечно!
Ward 16.06.2014 15:01:51
Небольшое дополнение к опции create-drop. Если этот параметр используется, он не удаляет всю схему, а отбрасывает таблицы, сопоставления которых доступны во время выполнения этого. Например, если в базе данных со схемой S есть таблицы A, B, C, а в коде Java есть сопоставления только для A и B, то Hibernate не удалит таблицу C.
Aditya 15.02.2015 17:09:07

Также есть недокументированное значение «none», чтобы полностью отключить его.

194
8.06.2012 14:52:14
Это на самом деле весьма полезно, поскольку проверка схемы Hibernate иногда не удается для совершенно корректных схем.
Michael Piefel 20.06.2012 08:51:11
Я как раз собирался попросить что-то подобное. Мое намерение состоит в том, чтобы сократить время запуска.
digao_mb 7.11.2013 18:56:28
«пустая строка» лучше, чем «нет» . Чтобы использовать 'none', вы получите предупреждение: org.hibernate.cfg.SettingsFactory - Нераспознанное значение для "hibernate.hbm2ddl.auto": none
okwap 6.06.2014 07:14:14
Я исправил это. Добавлено «нет» в качестве явно допустимой константы.
Sanne 3.05.2016 11:24:12
Мне нравится "hibernate.hbm2ddl.auto = potato" над другими stackoverflow.com/a/15810379/838444
Sneg 20.07.2016 12:25:33

Я думаю, что вы должны сосредоточиться на

SchemaExport Class 

Этот класс делает вашу конфигурацию динамичной, так что он позволяет вам выбирать то, что вам больше подходит ...

Оформить заказ [SchemaExport]

7
21.06.2012 02:12:24

Во-первых, возможны следующие значения hbm2ddlсвойства конфигурации:

  • none- Никаких действий не выполняется. Схема не будет сгенерирована.
  • create-only - Схема базы данных будет сгенерирована.
  • drop - Схема базы данных будет удалена и создана впоследствии.
  • create - Схема базы данных будет удалена и создана впоследствии.
  • create-drop- Схема базы данных будет удалена и создана впоследствии. После закрытия SessionFactory, схема базы данных будет удалена.
  • validate - Схема базы данных будет проверена с использованием сопоставлений сущностей.
  • update - Схема базы данных будет обновлена ​​путем сравнения существующей схемы базы данных с сопоставлениями сущностей.

Я посвятил пост в блоге наиболее распространенным стратегиям создания Hibernate DDL :

  1. Это hibernate.hbm2ddl.auto="update"удобно, но менее гибко, если вы планируете добавлять функции или выполнять некоторые пользовательские сценарии.
  2. Наиболее гибкий подход заключается в использовании пролетного пути .

Однако, даже если вы используете Flyway, вы все равно можете сгенерировать начальный сценарий миграции, используя hbm2ddl. В этой статье вы увидите, как можно объединить модель сущности JPA с моделью таблиц jOOQ.

46
15.04.2019 15:29:23

Если вы не хотите использовать Strings в своем приложении и ищете предопределенные константы, взгляните на org.hibernate.cfg.AvailableSettingsкласс, включенный в JAR Hibernate, где вы найдете константу для всех возможных настроек. В вашем случае, например:

/**
 * 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";
17
8.06.2015 10:17:30
Почему ссылка на исходный файл длиной более 700 строк над прямым ответом содержит почти 500 полетов?
Pavel Niedoba 29.07.2015 08:41:05
... этот вопрос не имеет никакого смысла. Почему есть вещи? Почему я даже здесь?
specializt 15.11.2018 16:41:43

Теоретически вы можете установить hibernate.hbm2ddl.auto = update, чтобы обновить вашу базу данных с изменениями в вашей модели, но я бы не стал доверять этому в рабочей базе данных. В более ранней версии документации говорилось, что это, по крайней мере, экспериментально; Я не знаю текущий статус.

Поэтому для нашей производственной базы данных не устанавливайте hibernate.hbm2ddl.auto - по умолчанию не производится никаких изменений в базе данных. Вместо этого мы вручную создаем сценарий обновления SQL DDL, который применяет изменения от одной версии к другой.

-5
17.11.2016 06:50:42

Хотя это довольно старый пост, но, поскольку я провел небольшое исследование по этой теме, я решил поделиться им.

hibernate.hbm2ddl.auto

Согласно документации он может иметь четыре допустимых значения:

создать | обновление | проверить | создание-падение

Ниже приведено объяснение поведения, показанного этими значениями:

  • создать : - создать схему, данные, ранее присутствовавшие (если они есть) в схеме, будут потеряны
  • update: - обновить схему с заданными значениями.
  • проверить: - проверить схему. Это не меняет БД.
  • create-drop: - создать схему с уничтожением ранее имеющихся данных (если они есть). Он также удаляет схему базы данных, когда SessionFactory закрыт.

Ниже приведены важные моменты, на которые стоит обратить внимание:

  • В случае обновления , если схема отсутствует в БД, схема создается.
  • В случае проверки , если схема не существует в БД, она не создается. Вместо этого он выдаст ошибку:Table not found:<table name>
  • В случае create-drop схема не удаляется при закрытии сеанса. Он сбрасывается только при закрытии SessionFactory.
  • В случае, если я даю какое-либо значение этому свойству (скажем, abc, вместо четырех вышеупомянутых значений) или оно просто остается пустым. Это показывает следующее поведение:

    -Если схема отсутствует в БД: - Создает схему

    -Если схема присутствует в БД: - обновите схему.

49
7.08.2016 15:50:28
Это действительно очень важный момент, что схема будет создана, если она не существует, когда используется «обновление».
yuranos87 9.02.2018 08:23:11
create-drop противоречит при сравнении утверждений «Объяснение поведения» и «Важные моменты».
VNT 25.04.2018 08:13:20
В чем разница между обновлением и пустым ?
yashjain12yj 17.09.2019 12:56:24

Начиная с 5.0 , теперь вы можете найти эти значения в выделенном Enum: org.hibernate.boot.SchemaAutoTooling(улучшено со значением NONEс 5.2).

Или, что еще лучше, начиная с версии 5.1 , вы также можете использовать тот, который сочетает в себе JPA 2 и «устаревшие» действия Hibernate DDL.org.hibernate.tool.schema.Action Enum

Но вы еще не можете настроить DataSourceпрограммно с этим. Было бы лучше использовать это в сочетании с, org.hibernate.cfg.AvailableSettings#HBM2DDL_AUTOно текущий код ожидает Stringзначение (отрывок взят из SessionFactoryBuilderImpl):

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

... и внутренние enumценности обоих org.hibernate.boot.SchemaAutoToolingи org.hibernate.tool.schema.Actionне раскрываются публично.

Ниже приведен пример программной DataSourceконфигурации (используемой в моих приложениях Spring Boot), в которой используется гамбит, .name().toLowerCase()но он работает только со значениями без черты (не create-dropдля примера):

@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();
}
3
19.08.2016 12:16:12
  • validate: проверяет схему, с базой данных никаких изменений не происходит.
  • update: обновляет схему текущим запросом на выполнение.
  • create: каждый раз создает новую схему и уничтожает предыдущие данные.
  • create-drop: удаляет схему, когда приложение остановлено или SessionFactory закрыто явно.
8
16.04.2019 20:30:47
Что такое «официальная» ссылка на документацию? - просто интересно ...
Dirk Schumacher 17.11.2019 10:21:10

hibernate.hbm2ddl.auto автоматически проверяет и экспортирует DDL в схему при создании sessionFactory.

По умолчанию он не выполняет никакого создания или изменения автоматически в БД. Если пользователь устанавливает одно из следующих значений, то это делает изменения схемы DDL автоматически.

  • создавать - делать создание схемы

    <entry key="hibernate.hbm2ddl.auto" value="create">
  • обновить - обновить существующую схему

    <entry key="hibernate.hbm2ddl.auto" value="update">
  • validate - проверить существующую схему

    <entry key="hibernate.hbm2ddl.auto" value="validate">
  • create-drop - создавать и удалять схему автоматически, когда начинается и заканчивается сеанс

    <entry key="hibernate.hbm2ddl.auto" value="create-drop">
27
10.07.2017 12:20:28
что насчет <entry key = "hibernate.hbm2ddl.auto" value = "none">?
VNT 25.04.2018 08:07:06

validate: Проверяет схему и не вносит изменений в базу данных.
Предположим, что вы добавили новый столбец в файл сопоставления и выполните операцию вставки, он выдаст исключение «отсутствует столбец XYZ», поскольку существующая схема отличается от объекта, который вы собираетесь вставить. Если вы измените таблицу, добавив этот новый столбец вручную, затем выполните операцию вставки, тогда она обязательно вставит все столбцы вместе с новым столбцом в таблицу. Означает, что он не вносит никаких изменений / изменяет существующую схему / таблицу.

update: он изменяет существующую таблицу в базе данных при выполнении операции. Вы можете добавлять или удалять столбцы с помощью этой опции hbm2ddl. Но если вы собираетесь добавить новый столбец «NOT NULL», он будет игнорировать добавление этого конкретного столбца в базу данных. Потому что таблица должна быть пустой, если вы хотите добавить столбец NOT NULL в существующую таблицу.

4
15.10.2017 14:44:57