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

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

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

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1 143
0
1 098 782
13

Ответы 13

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

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

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

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

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

Frans 23.01.2014 13:30

Нет, и create-drop, и create удаляют таблицы при создании sessionfactory, затем create-drop удаляют таблицы также при закрытии sessionfactory. См. stackoverflow.com/a/6752698/1536382

Testo Testini 03.11.2015 13:54

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

METTAIBI 09.02.2017 14:18

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

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

Nathan Voxland 04.11.2009 10:06

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

hibernate.hbm2ddl.auto Automatically validates or exports schema DDL to the database when the SessionFactory is created. With create-drop, the database schema will be dropped when the SessionFactory is closed explicitly.

e.g. validate | update | create | create-drop

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

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

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

Просто прочтите документ о спящем режиме ... для допустимых значений там написано: "например" ... есть ли другие допустимые значения?

Ta Sas 11.07.2010 02:20

Не то, чтобы я в курсе. Они могут быть использованы неправильно, например, или значения могут быть просто недокументированы.

James McMahon 13.07.2010 01:00

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

szegedi 20.09.2012 17:21

проверка говорит проверить схему, что именно это означает ??

Hussain Akhtar Wahid 'Ghouri' 19.09.2013 02:08

Привет - ага, я знаю, и видел полное использование, "проверка" означает именно это - он будет сравнивать схему базы данных с вашим объявленным (или аннотированным) слоем данных (Hibernate) и жаловаться (или ломаться?), Если что-то не совпадает. Но он не будет вносить никаких изменений в саму базу данных.

demaniak 09.10.2013 19:41

Я заметил, что если я изменю тип столбца в модели, тот же столбец в базе данных не изменится с помощью Обновить.

Filipe 21.05.2014 18:21

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

petertc 06.06.2014 11:15

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

Ward 16.06.2014 19:01

Есть ли какой-либо вариант, который говорит, просто создайте, если не существует, не обновляйте, не сбрасывайте :(

mmm 17.12.2014 20:01

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

Aditya 15.02.2015 20:09

@Aditya create-drop не отбрасывает "схему" а также не создает ее.

Grim 04.03.2016 13:53

Обратите внимание, что create-drop удаляет не базу данных, просто закрывающую сеанс, а Сессионная фабрика.

chAmi 16.07.2016 16:04

Мой опыт противоречит комментарию @Ward: когда я использую значение типа "no_validation", я получаю: `` java.lang.IllegalArgumentException: Unrecognized legacy hibernate.hbm2ddl.auto value: no_validation `` `

Shlomo Georg Konwisser 01.01.2019 02:31

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

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

Michael Piefel 20.06.2012 12:51

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

digao_mb 07.11.2013 22:56

Значение «none» очень полезно также, когда вы хотите использовать динамическую / программную конфигурацию Hibernate; любое другое значение вызовет ошибку при запуске приложения.

arpadf 04.04.2014 20:57
"пустая строка" лучше, чем "ничего". Чтобы использовать "none", вы получите предупреждающее сообщение: org.hibernate.cfg.SettingsFactory - Нераспознанное значение для "hibernate.hbm2ddl.auto": none
petertc 06.06.2014 11:14

Я его залатал. В качестве явно допустимой константы добавлено "none".

Sanne 03.05.2016 14:24

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

Sneg 20.07.2016 15:25

Найдите журнал «Нераспознанное значение hbm2ddl_auto: нет. Поддерживаемые значения включают создание, создание-удаление, обновление и проверку. Игнорирование». : D

James Jithin 20.04.2017 22:26

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

SchemaExport Class 

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

Касса [SchemaExport]

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

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

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

Итак, самый гибкий подход должен использовать Пролетный путь.

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

drop не кажется подходящим вариантом. Какую версию гибернации вы имеете в виду?
xagaffar 04.02.2021 15:17

Это допустимый вариант со времен Hibernate 5.1, выпущенного в 2016 году. Для получения дополнительных сведений ознакомьтесь с перечислением Action. Я предполагаю, что вы используете очень старую версию Hibernate.

Vlad Mihalcea 04.02.2021 16:20

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

/**
 * 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";

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

Pavel Niedoba 29.07.2015 11:41

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

specializt 15.11.2018 19:41

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

hibernate.hbm2ddl.auto

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

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

Ниже приводится объяснение поведения этих значений:

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

Следует отметить следующие важные моменты:

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

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

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

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

yuranos 09.02.2018 11:23

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

VNT 25.04.2018 11:13

В чем разница между Обновить и пустой?

yashjain12yj 17.09.2019 15:56

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

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

Но, вы пока не можете программно настроить 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();
}
  • validate: проверяет схему, в базе данных не происходит никаких изменений.
  • update: обновляет схему текущим запросом на выполнение.
  • create: каждый раз создает новую схему и уничтожает предыдущие данные.
  • create-drop: удаляет схему при остановке приложения или явном закрытии SessionFactory.

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

Dirk Schumacher 17.11.2019 13:21

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

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

VNT 25.04.2018 11:07

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

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

Для тех, кто ищет значение по умолчанию ...

Это написано в исходном коде Spring-boot версии 2.0.5 и 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;

Другие вопросы по теме