Какие можно устанавливать параметры в hbm2ddl
Каковы возможные значения конфигурации Hibernate hbm2ddl.auto и что они делают
Я действительно хочу узнать больше об обновлении, экспорте и значениях, которые могут быть присвоены hibernate.hbm2ddl.auto
Мне нужно знать, когда использовать обновление, а когда нет? И какова альтернатива?
Это изменения, которые могут произойти по БД:
В каждом случае лучшее решение?
ОТВЕТЫ
Ответ 1
hibernate.hbm2ddl.auto Автоматически проверяет или экспортирует DDL схемы в базу данных при создании SessionFactory. С помощью create-drop схема базы данных будет удалена, если SessionFactory будет закрыта явно.
например. Проверить | обновление | создать | create-drop
Итак, список возможных вариантов:
Эти параметры, по-видимому, предназначены для разработчиков, а не для облегчения создания баз данных уровня производительности, возможно, вы захотите рассмотреть следующий вопрос; Hibernate: hbm2ddl.auto = обновление в производстве?
Ответ 2
Также недокументированное значение «none» полностью отключает его.
Ответ 3
Свойство конфигурации называется hibernate.hbm2ddl.auto
В нашей среде разработки мы устанавливаем hibernate.hbm2ddl.auto=create-drop для удаления и создания чистой базы данных при каждом развертывании, чтобы наша база данных находилась в известном состоянии.
В теории вы можете установить hibernate.hbm2ddl.auto=update для обновления базы данных с изменениями к вашей модели, но я бы не стал доверять этому в производственной базе данных. В более ранней версии документации говорилось, что это было экспериментально, по крайней мере; Я не знаю текущий статус.
Ответ 4
Я бы использовал liquibase для обновления вашего db. Функция обновления схемы спящего режима действительно только o.k. для разработчика, пока они разрабатывают новые функции. В производственной ситуации обновление db необходимо обрабатывать более тщательно.
Ответ 5
Хотя это довольно старая должность, но, как я сделал некоторые исследования по этой теме, подумал о том, чтобы поделиться ею.
hibernate.hbm2ddl.auto
В соответствии с документацией он может иметь четыре допустимых значения:
создать | обновление | Проверить | создать падение
Ниже приводится объяснение поведения, показанного этими значениями:
Ниже перечислены важные моменты:
Если я даю какое-либо значение этому свойству (скажем, abc, а не выше четырех значений, рассмотренных выше), либо он просто оставлен пустым. Он показывает следующее поведение:
Ответ 6
hibernate.hbm2ddl.auto автоматически проверяет и экспортирует DDL в схему при создании sessionFactory.
По умолчанию он не выполняет автоматическое создание или изменение в БД. Если пользователь устанавливает одно из значений ниже, он автоматически изменяет схемы DDL.
Ответ 7
Во-первых, возможные значения для hbm2ddl конфигурации hbm2ddl следующие:
Я посвятил пост в блоге наиболее распространенным стратегиям создания Hibernate DDL:
Однако, даже если вы используете Flyway, вы все равно можете сгенерировать начальный сценарий миграции, используя hbm2ddl. В этой статье вы узнаете, как можно объединить модель сущности JPA с моделью таблиц jOOQ.
Ответ 8
Ответ 9
Думаю, вам стоит сосредоточиться на
этот класс делает вашу конфигурацию динамической Таким образом, он позволяет вам выбирать любые сюиты, которые вам нравятся.
Ответ 10
Ответ 11
validate : он проверяет схему и не вносит изменений в БД.
Предположим, вы добавили новый столбец в файл сопоставления и выполнили операцию вставки, он будет генерировать исключение «без столбца XYZ», потому что существующая схема отличается от объекта, который вы собираетесь вставлять. Если вы измените таблицу, добавив этот новый столбец вручную, затем выполните операцию Insert, то она обязательно введет все столбцы вместе с новым столбцом в таблицу. Это означает, что он не вносит никаких изменений/изменений в существующую схему/таблицу.
update : он изменяет существующую таблицу в базе данных при выполнении операции. Вы можете добавлять или удалять столбцы с помощью этой опции hbm2ddl. Но если вы собираетесь добавить новый столбец «NOT NULL», он будет игнорировать добавление этого конкретного столбца в БД. Поскольку таблица должна быть пустой, если вы хотите добавить столбец «NOT NULL» в существующую таблицу.
Ответ 12
Начиная с версии 5.0, вы можете найти эти значения в выделенном Enum : org.hibernate.boot.SchemaAutoTooling (расширенный со значением NONE с 5.2).
Hibernate, multi-tenancy и авто-обновление схемы БД
В чем, собственно, проблема?
Если в вашем приложении используется Hibernate и вам необходимо обеспечить автоматическое обновление схемы БД при использовании multi-tenant архитектуры со стратегией schema-per-tenant, вы не можете просто включить опцию для автообновления схемы:
Разберем почему. Придполагается, что читатель имеет представление о том, как работает multi-tenancy в Hibernate.
Конфигурация
БД: Postgres 9.2
ORM: Hibernate 4.3.7.Final + Envers
Multi-tenancy страдегия: schema-per-tenant с общим JDBC data source.
Основные настройки Hibernate:
Вспомогательные классы
Для хранения идентификатора tenant используется класс TenantId:
, где поле tenantId представляет собой название схемы в БД.
Класс Persistence, отвечающий за инициализацию Hibernate конфигурации и инициализацию SessionFactory:
Класс ConnectionProvider, неоходимый для окрытия коннекции к БД, используя data source:
Hibernate необходим класс, который будет открывать подключение к БД с указанным tenant и без него (опция hibernate.multi_tenant_connection_provider):
Hibernate необходим класс, необходимый для определения текущего tenant (опция hibernate.tenant_identifier_resolver):
Postres диалект для поддержки multi-tenancy
В случае, если в маппингах классов используются sequence для генерирования id, стандартный PostgreSQL9Dialect, поставляемый Hibernate, не позволит корректно генерировать update скрипты для создания sequence. Проблема кроется в следующем методе класса org.hibernate.dialect.PostgreSQL81Dialect:
Данный метод вызывается Hibernate для получения существующих sequence, чтобы определить, какие update скрипты надо сгенерировать. Проблема в том, что данный SQL запрос вернет sequence для всех схем, а не только для той, для которой мы генерируем update скрипты. Решением данной проблемы занимается созданный нами диалект:
В конфигурации Hibernate указываем диалект:
Авто-обновление схемы
В конфигурации Hibernate закомментирована опция hbm2ddl.auto, так как Hibernate не умеет обновлять схему БД при использовании выбранной multi-tenancy стратегии. Для автоматического обновления схемы напишем свою реализацию (почти полностью скопированную из исходных кодов Hibernate):
Русские Блоги
Детали конфигурации Hibernate.hbm2ddl.auto
подробности конфигурации hibernate.hbm2ddl.auto
Узел конфигурации hibernate.hbm2ddl.auto в hibernate.cfg.xml выглядит следующим образом:
Справочная документация по Hibernate 3.3.1 объясняет следующее:
Automatically validate or export 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.
eg. validate | update | create | create-drop
На самом деле функция параметра hibernate.hbm2ddl.auto в основном используется для:
Автоматически создавать | обновлять | проверять структуру таблицы базы данных
Если это не соответствует этому требованию, рекомендуется установить значение = «none».
Каждый раз, когда загружается спящий режим, последняя сгенерированная таблица будет удаляться, а затем новая таблица будет регенерирована в соответствии с классом вашей модели, даже если дважды не было изменений, это важная причина потери данных таблицы базы данных.
Таблица создается в соответствии с классом модели каждый раз, когда загружается спящий режим, но таблица автоматически удаляется, как только sessionFactory закрывается.
Наиболее часто используемые атрибуты, структура таблицы будет автоматически установлена в соответствии с классом модели при первой загрузке спящего режима (при условии, что сначала установлена база данных), а структура таблицы будет автоматически обновляться в соответствии с классом модели, когда hibernate загружается позже, даже если структура таблицы изменится, структура таблицы «Строка все еще существует» не удалит предыдущую строку. Следует отметить, что при развертывании на сервере структура таблицы не будет установлена сразу, это произойдет только после того, как приложение запустится в первый раз.
Каждый раз, когда загружается спящий режим, структура таблицы базы данных проверяется, и только при сравнении с таблицей в базе данных новая таблица не будет создана, но будут вставлены новые значения.
Когда мы помещаем hibernate.hbm2ddl.auto = сначала создать спящий режимhbm2ddl Для создания схемы базы данных.
Когда мы закомментировали атрибут hbm2ddl в файле hibernate.cfg.xml, мы отменяем использование hbm2ddl для генерации схемы базы данных при запуске. Обычно вам нужно открывать его только при повторении модульных тестов, но повторный запуск hbm2ddl удалит все, что вы сохранили (drop).
Значение конфигурации создания
: «При создании SessionFactory удалите все таблицы из схемы, а затем создайте их заново».
Обратите внимание, что многие новички в Hibernate потерпят неудачу на этом этапе. Время от времени мы получаем вопросы о сообщениях об ошибках Table not found. Однако до тех пор, пока вы будете следовать шагам, описанным выше, такой проблемы не будет, потому что hbm2ddl создаст схему базы данных при первом запуске и может продолжать использовать эту схему после следующего перезапуска приложения. Если вы изменяете отображение или схему базы данных, вам необходимо повторно открыть hbm2ddl.
За последние два дня я организовал Spring + JPA (реализация Hibernate) и скопировал из Интернета раздел конфигурации параметров подключения Hibernate.
В результате при тестировании всегда обнаруживается, что данные таблицы базы данных отсутствуют. Раньше этот параметр не использовался, я проверил другие вещи и, наконец, нашел этот. Быстро проверьте конфигурацию параметра Hibernate, объяснение выглядит следующим образом:
hibernate.hbm2ddl.auto Automatically validate or export 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.
eg. validate | update | create | create-drop
Фактически, функция этого параметра в основном используется для: автоматического создания | обновления | проверки структуры таблицы базы данных. Если это не соответствует этому требованию, рекомендуется установить значение = «none».
Разрешите пояснить значение еще нескольких параметров:
validate
При загрузке гибернации убедитесь, что структура таблицы базы данных создана.
create
Каждый раз, когда загружается спящий режим, структура таблицы базы данных воссоздается заново, что является причиной потери данных таблицы базы данных.
create-drop
update
Загрузите спящий режим для автоматического обновления структуры базы данных
Все указанные выше 4 атрибута работают со всеми таблицами сопоставления, используемыми в одном файле конфигурации.
подводить итоги:
Пожалуйста, используйте этот параметр осторожно, не используйте его случайно, если в нем нет необходимости.
Если вы обнаружите, что таблицы базы данных отсутствуют, проверьте конфигурацию hibernate.hbm2ddl.auto
Интеллектуальная рекомендация
Разница между ArrayList и LinkedList
ArrayList: Нижний слой представляет собой массив, хорошо подходящий для поиска данных (доступа) LinkedList: Базовый связанный список, удобный для изменения данных (включая добавление и удаление данных.
nginx скомпилируйте и установите
nginx скомпилируйте и установите 1. Установите среду компиляции 2. Установите программный пакет pcre (сделайте так, чтобы nginx поддерживал модуль перезаписи http) 3. Установите openssl-devel (сделайт.
Используйте Matlab, чтобы нарисовать трехмерный график разложения Фурье
цель: Изучите анализ преобразования Фурье и другие методы анализа. Понять взаимосвязь между частотной областью преобразования Фурье и временной областью. Используйте MATLAB, чтобы нарисовать трехмерну.
Поговорим о статусе IPv6 и переходе
1. Текущее состояние3 февраля 2011 года адреса IPv4 были выделены, и основные операторы ждут, чтобы исчерпать свои сбережения. Люди все больше полагаются на проводные и беспроводные маршрутизаторы, та.
The note introduces basic Python syntax and strings. Python notes of open courses @Codecademy. Brief Introduction Python is a high level scripting language with object oriented features. Python progra.
Документация разработчика Hibernate – Глава I. Доступ к базе данных
Перевод статьи актуален для версии Hibernate 4.2.19.Final
Предисловие
Работа как с объектно-ориентированным ПО, так и с реляционными базами данных (далее БД, прим.перев.) может быть весьма обременительной и затратной с точки зрения потраченного времени. Затраты на разработку существенно выше из-за несовпадения парадигм представления данных в объектах и реляционных БД. Hibernate является решением т.н. объектно-реляционного проецирования для Java. Термин объектно-реляционного проецирования отноcится к технике проецирования (маппинга) данных из объектной модели представления к реляционной модели представления (и наоборот). См. en.wikipedia.org/wiki/Object-relational_mapping для более подробного ознакомления.
Hibernate не только заботится о проецировании Java-классов в таблицы БД (а также проецировании базовых типов Java к типам SQL), но и предоставляет механизмы формирования запросов и выборок данных. Он может существенно снизить время на разработку, которая в старом стиле велась путем ручной работы с данными с использованием SQL и JDBC. Главная цель архитектурного дизайна Hibernate – избавление разработчика от ежедневных задач работы с данными БД, путем избавления от нужд написания собственной логики работы с данными через SQL и JDBC. Однако, в отличие от других persistence-решений, Hibernate не скрывает от вас возможность использовать всю мощь SQL, и гарантирует, что ваши вложения в реляционные технологии и знания по-прежнему имеют силу.
Hibernate может быть не лучшим решением для приложений, хранящих всю свою бизнес-логику в хранимых процедурах, оно скорее подходит для объектно-ориентированных моделей и логики в среднем (бизнес) слое приложения, написанном на Java. Однако, Hibernate совершенно точно может помочь вам избавиться или инкапсулировать логику специфического SQL-кода, а также справиться с повседневными задачами трансляции результатов ваших запросов из табличного представления в граф объектов.
1. Доступ к базе данных
1.1. Подключение
Hibernate получает JDBC-соединения по мере необходимости через интерфейс org.hibernate.service.jdbc.connections.spi.ConnectionProvider. Приложения могут также предоставлять свои реализации интерфейса org.hibernate.service.jdbc.connections.spi.ConnectionProvider для определения кастомного подхода к предоставлению соединений Hibernate’у. (Из другого пула соединений, например)
1.1.1. Конфигурация
Вы можете сконфигурировать соединение к базе данных, используя property-файл, через XML-дескриптор развертывания или программно.
Пример 1.1. hibernate.properties для пула соединений c3p0
Пример 1.2. hibernate.cfg.xml для соединения к встраиваемой базе данных HSQL
1.1.1.1. Программная конфигурация
Экземпляр объекта org.hibernate.cfg.Configuration представляет полный набор типов маппингов на базу данных. Объект org.hibernate.cfg.Configuration создает иммутабельный объект org.hibernate.SessionFactory, и компилирует маппинги из различных XML-файлов. Вы можете указать файлы для маппинга напрямую, или Hibernate может найти их за вас.
Пример 1.3. Указание файлов для маппинга напрямую
Вы можете получить объект org.hibernate.cfg.Configuration, cоздав его и указав XML-документы для маппинга напрямую. Если файлы для маппинга находятся в classpath, используйте метод addResource().
Пример 1.4. Hibernate находит файлы за вас
Метод addClass() указывает Hibernate искать mapping-файлы через classpath, основываясь на имени класса, при этом избавляя вас от необходимости указывать имена файлов самому. В следующем примере, он ищет org/hibernate/auction/Item.hbm.xml и org/hibernate/auction/Bid.hbm.xml.
Пример 1.5. Указание свойств конфигурации
1.1.2. Получение JDBC-соединения
После того, как вы сконфигурируете Основные jdbc-свойства Hibernate, вы можете использовать метод openSession класса org.hibernate.SessionFactory для открытия сессий. Сессии откроют JDBC-cоединения по требованию, основываясь на предоставленной конфигурации.
Пример 1.6. Открытие сессии
1.2. Пулинг соединений (Connection pooling)
Внутренний алгоритм пулинга соединений в Hibernate довольно рудиментарен, и нужен, по большей части, для разработки и тестирования. Используйте сторонние (3 rd party) пулы для лучшей производительности и стабильности. Для использования 3 rd party пула, замените значение свойства hibernate.connection.pool_size на соответствующие специфике вашего выбранного пула. Это отключит использование встроенного пула Hibernate.
1.2.1. Пулинг с помощью c3p0
C3P0 – опенсорсный пул JDBC-соединений, распространяемый вместе с Hibernate в директории lib/. Hibernate будет использовать свой собственный org.hibernate.service.jdbc.connections.internal.C3P0ConnectionProvider для пулинга соединений, при настройке свойств hibernate.c3p0.*
1.2.2. Пулинг с помощью Proxool
Proxool — другой опенсорсный пул, распространяемый вместе с Hibernate в директории lib/. Hibernate будет использовать свой собственный org.hibernate.service.jdbc.connections.internal.ProxoolConnectionProvider для пулинга соединений при соответствующей настройке hibernate.proxool.*. В отличие от c3p0, proxool требует некоторых дополнительных параметров настройки, которые описаны в документации, доступной на proxool.sourceforge.net/configure.html.
Таблица 1.1. Важные конфигурационные свойства для пула соединений Proxool
Свойство | Описание |
---|---|
hibernate.proxool.xml | Сконфигурируйте провайдер Proxool, используя указанный файл XML (.xml добавляется автоматически) |
hibernate.proxool.properties | Сконфигурируйте провайдер Proxool, используя указанный property-файл (.properties добавляется автоматически) |
hibernate.proxool.existing_pool | Конфигурировать ли провайдер Proxool из существующего пула |
hibernate.proxool.pool_alias | Псевдоним пула Proxool. Необходим. |
1.2.3. Получение соединений от сервера приложений, через JNDI
1.2.4. Прочее по конфигурации соединений
Вы можете передавать произвольные свойства соединения, добавляя перед ними hibernate.connection. К примеру, для указания свойства charSet используйте имя hibernate.connection.charSet.
Вы можете определить свою стратегию для получения JDBC-соединений, реализовав интерфейс org.hibernate.service.jdbc.connections.spi.ConnectionProvider, и указав вашу пользовательскую реализацию при помощи свойства hibernate.connection.provider_class
1.2.5. Необязательные свойства конфигурации
В дополнение к свойствам, перечисленным выше, Hibernate включает в себя множество других параметров. См. более подробный список на http://docs.jboss.org/hibernate/orm/4.2/devguide/en-US/html_single/.
1.3. Диалекты
Хотя SQL относительно стандартизирован, каждый поставщик СУБД использует свое подмножество поддерживаемых синтаксисов. У этого есть и другой термин, называемый диалектом. Hibernate поддерживает различные вариации диалектов через класс org.hibernate.dialect.Dialect и различные подклассы для каждого vendor-диалекта.
Таблица 1.2. Поддерживаемые диалекты СУБД
1.3.1. Указание диалекта для использования
Разработчик может вручную указать диалект для использования, указав в свойстве hibernate.dialect нужное имя подкласса org.hibernate.dialect.Dialect.
1.3.2. Разрешение диалекта
Заранее предположив, что org.hibernate.service.jdbc.connections.spi.ConnectionProvider был настроен, Hibernate попытается автоматически определить диалект, основываясь на java.sql.DatabaseMetaData получаемым из объекта java.sql.Connection, который в свою очередь достается из org.hibernate.service.jdbc.connections.spi.ConnectionProvider.
Эта функциональность предоставляется экземплярами org.hibernate.service.jdbc.dialect.spi.DialectResolver, зарегистрированными cамим фреймворком. Hibernate идет вместе со стандартным набором распознаваний. Если в вашем приложении требуются дополнительные возможности распознавания диалекта, вполне возможно зарегистрировать кастомную реализацию org.hibernate.service.jdbc.dialect.spi.DialectResolver, как показано ниже
Зарегистрированные реализации org.hibernate.service.jdbc.dialect.spi.DialectResolver добавляются во внутренний список resolverов, так что они имеют приоритет над уже ранее зарегистрированными resolver’ами, а также над стандартными.
1.4. Автоматическая генерация схемы при помощи SchemaExport
Перед тем, как Hibernate сможет сгенерировать вашу схему, вы должны кастомизировать ваши файлы маппинга.
1.4.1. Кастомизация файлов маппинга (Customizing the mapping files)
Hibernate предоставляет ряд элементов и атрибутов для ваших файлов маппинга. Они перечислены в Таблице 1.3, “Элементы и аттрибуты, предоставляемые для кастомизации файлов маппинга”, а логический порядок кастомизации представлен в Процедуре 1.1, “Кастомизация схемы”.
Таблица 1.3. Элементы и атрибуты, предоставляемые для кастомизации файлов маппинга
Имя | Тип значения | Описание |
---|---|---|
length | number | Длина колонки |
precision | number | Десятичная точность колонки |
scale | number | Десятичный масштаб колонки |
not-null | true или false | Может ли колонка содержать null-значения |
unique | true или false | Содержит ли колонка только уникальные значения |
index | string | Имя многоколоночного индекса |
unique-key | string | Имя многоколоночного ограничения на уникальность |
foreign-key | string | Имя ограничения внешнего ключа, генерируемое для ассоциаций. Это относится к <one-to-one>, <many-to-one>, <key>, и <many-to-many> элементам. inverse=«true» пропускаются SchemaExport. |
sql-type | string | Переопределяет тип колонки по-умолчанию. Это относится только к элементу <column>. |
default | string | Значение по-умолчанию для колонки |
check | string | SQL ограничения (SQL check constraint) либо на колонку, либо на таблицу |
Процедура 1.1. Кастомизация схемы
1. Установка длины, точности, и масштаба элементов маппинга.
Множество элементов маппинга определяют необязательные атрибуты, такие как длина, точность, и масштаб.
2. Установка not-null, UNIQUE, unique-key аттрибутов.
not-null и UNIQUE атрибуты генерируют ограничения на табличные колонки.
Атрибут unique-key группирует колонки в единое ограничение по уникальности. Атрибут переопределяет имя любого сгенерированного ограничения уникальности.
3. Установка index и foreign-key аттрибутов.
Атрибут index указывает имя индекса для его создания, используя спроецированную колонку или колонки. Вы можете сгруппировать несколько колонок по одному индексу, указав в каждой из них имя одного и того же индекса.
Атрибут внешнего ключа (foreign key) переопределяет имя любого сгенерированного ограничения внешнего ключа.
4. Установка дочерних <column>-элементов.
Множество элементов маппинга допускают использование дочерних <column> элементов. Это бывает полезно для маппинга типов, включающих в себя несколько колонок.
5. Установка атрибута default.
Атрибут default представляет собой значение по-умолчанию для колонки. Добавьте значение к спроецированному свойству перед сохранением нового экземпляра класса.
6. Установка атрибута sql-type.
Используйте атрибут sql-type для переопределения маппинга по-умолчанию для типов Java на типы SQL.
7. Установка атрибута check.
Используйте атрибут check для указания ограничения check.
8.Добавление <comment> элементов к вашей схеме.
Используйте элемент <comment> для указания комментариев для сгенерированной схемы.
1.4.2. Запуск инструмента SchemaExport
Инструмент SchemaExport записывает DDL-скрипт в стандартный поток вывода, исполняет DDL, или и то, и другое сразу.
Пример 1.7. Синтаксис SchemaExport
Таблица 1.4. Опции SchemaExport
Опция | Описание |
---|---|
—quiet | Не выводить скрипт в стандартный поток вывода |
—drop | Только удалять таблицы |
—create | Только создавать таблицы |
—text | Не экспортировать в БД |
—output=my_schema.ddl | Вывести скрипт в указанный файл |
—naming=eg.MyNamingStrategy | выбор NamingStrategy |
—namingdelegator=eg.MyNamingStrategyDelegator | выбор NamingStrategyDelegator |
—config=hibernate.cfg.xml | Чтение конфигурации Hibernate из файла XML |
—properties=hibernate.properties | Чтение свойств БД из указанного файла |
—format | Опрятное форматирование SQL |
—delimiter=; | Разделитель строк |
Пример 1.8. Встраивание SchemaExport в ваше приложение