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

1008

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

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

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

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

Теги:
hibernate
hbm2ddl

13 ответов

1016

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

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

например. Проверить | обновление | создать | create-drop

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

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

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

  • 14
    Просто прочитайте документацию hibernate ... для правильных значений, он говорит: "например" ... есть ли другие допустимые значения?
  • 1
    Не то, чтобы я в курсе. Они могут неправильно использовать, например, или значения могут быть просто недокументированы.
Показать ещё 11 комментариев
168

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

  • 7
    Это на самом деле весьма полезно, так как валидация схемы Hibernate иногда дает сбой для совершенно корректных схем.
  • 0
    Я как раз собирался попросить что-то подобное. Мое намерение состоит в том, чтобы сократить время запуска.
Показать ещё 6 комментариев
139

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

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

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

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

  • 4
    На самом деле, согласно документации, create-drop создает таблицы базы данных и удаляет их, когда фабрика сеансов явно закрыта. Он не удаляет таблицы при создании фабрики сеансов.
  • 4
    Нет, и create-drop, и create отбрасывают таблицы при создании фабричной сессии, затем create-drop удаляет таблицы и при закрытой фабричной сессии. См. Stackoverflow.com/a/6752698/1536382
Показать ещё 1 комментарий
48

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

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

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

hibernate.hbm2ddl.auto

В соответствии с документацией он может иметь четыре допустимых значения:

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

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

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

Ниже перечислены важные моменты:

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

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

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

  • 0
    Это действительно очень важный момент, что схема будет создана, если она не существует, когда используется «обновление».
  • 0
    create-drop противоречит при сравнении утверждений «Объяснение поведения» и «Важные моменты».
23

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

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

  • create - создание схемы

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

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

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

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

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

16

Если вы не хотите использовать 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";
  • 5
    Почему ссылка на исходный файл длиной более 700 строк над прямым ответом содержит почти 500 полетов?
  • 0
    ... этот вопрос не имеет никакого смысла. Почему есть вещи? Почему я даже здесь?
7

Думаю, вам стоит сосредоточиться на

SchemaExport Class 

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

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

4

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

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

3

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

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

Но, вы еще не можете настроить 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();
}
2

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

-4

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню