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


1085

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

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

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

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

Ответы:


1083

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

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

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

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

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

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


14
Просто прочитайте документацию hibernate ... для правильных значений написано: "например" ... есть ли другие допустимые значения?
Та Сас

16
Я думаю, что он говорит «например», потому что это просто документация сообщества, если кто-то заинтересован во всех возможных значениях, его можно найти в javadoc Hibernate. (И да, присутствуют только эти четыре варианта) docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/cfg/…
szegedi

4
validate говорит валидация схемы, что именно это означает ??
Хуссейн Ахтар Вахид 'Ghouri'

6
Вы также можете использовать «aardvark», «голубь» или любое другое слово, если вы хотите, чтобы hibernate ничего не делал. Не то, чтобы я рекомендовал это конечно!
Ward

2
Небольшое дополнение к опции create-drop. Если этот параметр используется, он не удаляет всю схему, а отбрасывает таблицы, сопоставления которых доступны во время выполнения этого. Например, если в базе данных со схемой S есть таблицы A, B, C и в коде Java есть сопоставления только для A и B, то Hibernate не удалит таблицу C.
Aditya

194

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


7
Это на самом деле весьма полезно, так как проверка схемы Hibernate иногда не удается для совершенно корректных схем.
Майкл Пифель

Я как раз собирался попросить что-то подобное. Мое намерение состоит в том, чтобы сократить время запуска.
digao_mb

46
«пустая строка» лучше, чем «нет» . Чтобы использовать 'none', вы получите предупреждение: org.hibernate.cfg.SettingsFactory - Нераспознанное значение для "hibernate.hbm2ddl.auto": none
okwap

14
Я исправил это. Добавлено «нет» в качестве явно допустимой константы.
Санне

9
Мне нравится "hibernate.hbm2ddl.auto = potato" над другими stackoverflow.com/a/15810379/838444
Снег

161

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

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

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

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


5
На самом деле, согласно документации, create-drop создает таблицы базы данных и удаляет их, когда фабрика сеансов явно закрыта. Он не удаляет таблицы при создании фабрики сеансов.
Франс

4
Нет, как create-drop, так и create отбрасывают таблицы при создании фабричной сессии, затем create-drop удаляет таблицы и при закрытой фабричной сессии. См. Stackoverflow.com/a/6752698/1536382
Testo Testini

Может ли создание hibernate.hbm2ddl.auto = create-drop в производственном процессе привести к нескольким тайм-аутам соединения в производственном процессе?
METTAIBI

51

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


6
См stackoverflow.com/questions/221379/... , почему вы не должны использовать hbm2ddl для производства.
Натан Воксланд

51

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

hibernate.hbm2ddl.auto

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

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

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

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

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

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

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

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


Это действительно очень важный момент, что схема будет создана, если она не существует, когда используется «обновление».
Юран

create-drop противоречит при сравнении утверждений «Объяснение поведения» и «Важные моменты».
VNT

2
Какая разница между обновлением и пустым ?
yashjain12yj

46

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

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

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

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

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


27

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">

2
что насчет <entry key = "hibernate.hbm2ddl.auto" value = "none">?
VNT

17

Если вы не хотите использовать строки в своем приложении и ищете предопределенные константы, взгляните на 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";

5
Почему ссылка на исходный файл длиной более 700 строк над прямым ответом содержит почти 500 полетов?
Павел Недоба

... этот вопрос не имеет никакого смысла. Почему есть вещи? Почему я даже здесь?
специалист

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

Что такое «официальная» ссылка на документацию? - просто интересно ...
Дирк Шумахер

7

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

SchemaExport Class 

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

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


4

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

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


3

Начиная с 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();
}

0

Кому ищет значение по умолчанию ...

Это написано в исходном коде версии 2.0.5 Spring-Boot и 1.1.0 в 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;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.