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




Свойство конфигурации называется hibernate.hbm2ddl.auto.
В нашей среде разработки мы настраиваем hibernate.hbm2ddl.auto=create-drop на удаление и создание чистой базы данных при каждом развертывании, чтобы наша база данных находилась в известном состоянии.
Теоретически вы можете настроить hibernate.hbm2ddl.auto=update на обновление вашей базы данных с учетом изменений вашей модели, но я бы не стал доверять этому в производственной базе данных. В более ранней версии документации говорилось, что это, по крайней мере, экспериментальное; Текущее состояние мне неизвестно.
Поэтому для нашей производственной базы данных не устанавливайте hibernate.hbm2ddl.auto - по умолчанию изменения в базе данных не выполняются. Вместо этого мы вручную создаем сценарий обновления SQL DDL, который применяет изменения от одной версии к другой.
Нет, и create-drop, и create удаляют таблицы при создании sessionfactory, затем create-drop удаляют таблицы также при закрытии sessionfactory. См. stackoverflow.com/a/6752698/1536382
Может ли выполнение hibernate.hbm2ddl.auto = create-drop в производстве привести к нескольким тайм-аутам соединения в производстве?
Я бы использовал Ликибаза для обновления вашего db. Функция обновления схемы hibernate действительно только в порядке. для разработчика, пока они разрабатывают новые функции. В производственной ситуации с обновлением базы данных нужно обращаться более осторожно.
См. stackoverflow.com/questions/221379/…, чтобы узнать, почему вам не следует использовать hbm2ddl для производства.
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
Итак, список возможных вариантов:
Эти параметры кажутся предназначенными для инструментов разработчика, а не для облегчения работы с какими-либо базами данных производственного уровня. Возможно, вы захотите взглянуть на следующий вопрос; Гибернация: hbm2ddl.auto = обновление в производстве?
Просто прочтите документ о спящем режиме ... для допустимых значений там написано: "например" ... есть ли другие допустимые значения?
Не то, чтобы я в курсе. Они могут быть использованы неправильно, например, или значения могут быть просто недокументированы.
Я думаю, там написано "например" поскольку это просто документация сообщества, если кого-то интересуют все возможные значения, ее можно найти в javadoc Hibernate. (И да, присутствуют только эти четыре варианта) docs.jboss.org/hibernate/orm/4.1/javadocs/org/hibernate/cfg/…
проверка говорит проверить схему, что именно это означает ??
Привет - ага, я знаю, и видел полное использование, "проверка" означает именно это - он будет сравнивать схему базы данных с вашим объявленным (или аннотированным) слоем данных (Hibernate) и жаловаться (или ломаться?), Если что-то не совпадает. Но он не будет вносить никаких изменений в саму базу данных.
Я заметил, что если я изменю тип столбца в модели, тот же столбец в базе данных не изменится с помощью Обновить.
Также можно использовать "пустую строку".
Вы также можете использовать «трубкозуб», «голубь» или любое другое слово, если хотите, чтобы спящий режим ничего не делал. Конечно, я бы не рекомендовал это!
Есть ли какой-либо вариант, который говорит, просто создайте, если не существует, не обновляйте, не сбрасывайте :(
Небольшое дополнение к опции create-drop. Если этот параметр используется, он не удаляет всю схему, а удаляет таблицы, сопоставления которых доступны при выполнении этого. Например, если база данных со схемой S имеет таблицы A, B, C, а Java-код имеет сопоставления только для A и B, то Hibernate не удалит таблицу C.
@Aditya create-drop не отбрасывает "схему" а также не создает ее.
Обратите внимание, что create-drop удаляет не базу данных, просто закрывающую сеанс, а Сессионная фабрика.
Мой опыт противоречит комментарию @Ward: когда я использую значение типа "no_validation", я получаю: `` java.lang.IllegalArgumentException: Unrecognized legacy hibernate.hbm2ddl.auto value: no_validation `` `
Также есть недокументированное значение «none», чтобы полностью отключить его.
На самом деле это очень полезно, поскольку проверка схемы Hibernate иногда дает сбой для совершенно правильных схем.
Я как раз собирался попросить о чем-то подобном. Я намерен сократить время запуска.
Значение «none» очень полезно также, когда вы хотите использовать динамическую / программную конфигурацию Hibernate; любое другое значение вызовет ошибку при запуске приложения.
Я его залатал. В качестве явно допустимой константы добавлено "none".
Мне нравится "hibernate.hbm2ddl.auto = potato" по сравнению с другими stackoverflow.com/a/15810379/838444
Найдите журнал «Нераспознанное значение hbm2ddl_auto: нет. Поддерживаемые значения включают создание, создание-удаление, обновление и проверку. Игнорирование». : D
Я думаю, вам следует сосредоточиться на
SchemaExport Class
этот класс делает вашу конфигурацию динамической Таким образом, вы можете выбрать люксы, которые вам больше всего подходят ...
Касса [SchemaExport]
Во-первых, возможные значения свойства конфигурации hbm2ddl следующие:
none - Никаких действий не выполняется. Схема не будет создана.create-only - схема базы данных будет сгенерирована.drop - Схема базы данных будет удалена.create - Схема базы данных будет удалена и создана позже.create-drop - Схема базы данных будет удалена и создана позже. После закрытия SessionFactory схема базы данных будет удалена.validate - Схема базы данных будет проверена с использованием сопоставлений сущностей.update - Схема базы данных будет обновлена путем сравнения существующей схемы базы данных с сопоставлениями сущностей.hibernate.hbm2ddl.auto = "update" удобен, но менее гибок, если вы планируете добавлять функции или выполнять некоторые пользовательские сценарии.
Итак, самый гибкий подход должен использовать Пролетный путь.
Однако даже если вы используете Flyway, вы все равно можете сгенерировать сценарий начальной миграции с помощью hbm2ddl.
drop не кажется подходящим вариантом. Какую версию гибернации вы имеете в виду?
Если вы не хотите использовать строки в своем приложении и ищете предопределенные константы, взгляните на класс 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 взлетами полевок?
... этот вопрос не имеет никакого смысла. Почему есть вещи? Почему я вообще здесь?
Хотя это довольно старый пост, но, поскольку я провел некоторое исследование по этой теме, подумал о том, чтобы поделиться им.
hibernate.hbm2ddl.auto
Согласно документации, он может иметь четыре допустимых значения:
.
создать | обновление | проверить | создать-капля
Ниже приводится объяснение поведения этих значений:
Следует отметить следующие важные моменты:
Table not found:<table name>В случае, если я даю какое-либо значение этому свойству (скажем, abc вместо четырех значений, описанных выше), или оно просто остается пустым. Он показывает следующее поведение:
-Если схемы нет в БД: - Создает схему.
-Если схема присутствует в БД: - Обновить схема.
Это действительно очень важный момент, что схема будет создана, если она не существует, когда используется «обновление».
create-drop противоречит утверждениям «Объяснение поведения» и «Важные моменты».
В чем разница между Обновить и пустой?
Начиная с 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.Что такое «официальная» ссылка на документацию? - просто интересуюсь...
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">?
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;
Фактически, согласно документации, create-drop создает таблицы базы данных и удаляет их, когда фабрика сеансов явно закрывается. нет удаляет таблицы при создании фабрики сеансов.