В течение некоторого времени большинство основных реализаций JPA , таких как Hibernate , EclipseLink или OpenJPA , предлагали способы создания объектов схемы базы данных. К ним относятся генерация таблиц, первичных ключей, внешних ключей, индексов и других объектов. К сожалению, они не являются стандартными между реализациями при работе с несколькими средами. Только в последней спецификации JPA 2.1 была введена стандартизация генерации схемы.
Отныне, если вы используете Java EE 7 , вам не нужно беспокоиться о различиях между поставщиками. Просто используйте новые стандартные свойства, и все готово. Конечно, вы можете подумать, что они вообще не нужны, поскольку схемы баз данных для сред не должны управляться таким образом. Тем не менее, они очень полезны для целей разработки или тестирования.
Генерация схемы
Свойства:
Если вы хотите использовать новые стандарты для генерации схемы, просто добавьте любое из следующих свойств в раздел properties
файла persistence.xml
:
Имущество | Значения |
---|---|
javax.persistence.schema-generation.database.action
Определяет действие, которое необходимо предпринять в отношении схемы базы данных. Возможные значения говорят сами за себя. Если это свойство не является конкретным, в базе данных не выполняется никаких действий. |
нет, создать, удалить и создать, удалить |
javax.persistence.schema-generation.create-источник
Указывает, как должна быть создана схема базы данных. Это можно сделать, просто используя метаданные аннотации, указанные в объектах приложения, выполнив сценарий SQL или их комбинацию. Вы также можете определить порядок. Это свойство не нужно указывать для генерации схемы. Значением по умолчанию является метаданные . Вы должны быть осторожны, если используете комбинацию действий создания. В результате действия могут вызвать непредвиденное поведение в схеме базы данных и привести к сбою. |
метаданные, сценарий, метаданные, чем сценарий, сценарий, а затем метаданные |
javax.persistence.schema-generation.drop-источник
То же, что и javax.persistence.schema-generation.create-source , но для действий удаления. |
метаданные, сценарий, метаданные, чем сценарий, сценарий, а затем метаданные |
javax.persistence.schema-generation.create-script-source, javax.persistence.schema-generation.drop-script-source
Указывает целевое расположение файла сценария SQL, который будет выполняться при создании или удалении схемы базы данных. |
Строка для URL файла для выполнения |
javax.persistence.sql-нагрузка скрипт-источник
Указывает целевое расположение в файле SQL для загрузки данных в базу данных. |
Строка для URL файла для выполнения |
Кроме того, также можно генерировать сценарии SQL с помощью действий создания схемы:
Имущество | Значения |
---|---|
javax.persistence.schema-generation.scripts.action
Указывает, какие сценарии SQL должны быть сгенерированы. Сценарии генерируются только в том случае, если указаны соответствующие целевые местоположения генерации. |
нет, создать, удалить и создать, удалить |
javax.persistence.schema-generation.scripts.create-target, javax.persistence.schema-generation.scripts.drop-target
Указывает целевое расположение для создания файла сценария SQL для создания или удаления схемы базы данных. |
Строка для URL файла для выполнения |
образцы
В следующем примере удаляются и создаются объекты схемы базы данных, необходимые для приложения JPA. Полагается на метаданные аннотаций сущностей, а также выполняет произвольный файл SQL с именем load.sql
.
persistence.xml
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
|
<? xml version = "1.0" encoding = "UTF-8" ?> < persistence version = "2.1" xsi:schemaLocation = "http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" > < persistence-unit name = "MyPU" transaction-type = "JTA" > < properties > < property name = "javax.persistence.schema-generation.database.action" value = "drop-and-create" /> < property name = "javax.persistence.schema-generation.create-source" value = "metadata" /> < property name = "javax.persistence.schema-generation.drop-source" value = "metadata" /> < property name = "javax.persistence.sql-load-script-source" value = "META-INF/load.sql" /> </ properties > </ persistence-unit > </ persistence > |
Еще один пример, который генерирует объекты схемы базы данных для создания и удаления в целевых местоположениях:
persistence.xml
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
<? xml version = "1.0" encoding = "UTF-8" ?> < persistence version = "2.1" xsi:schemaLocation = "http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" > < persistence-unit name = "MyPU" transaction-type = "JTA" > < properties > < property name = "javax.persistence.schema-generation.scripts.action" value = "drop-and-create" /> < property name = "javax.persistence.schema-generation.scripts.create-target" value = "file:/tmp/create.sql" /> < property name = "javax.persistence.schema-generation.scripts.drop-target" value = "file:/tmp/drop.sql" /> </ properties > </ persistence-unit > </ persistence > |
Оба примера также могут быть объединены для удаления и создания объектов базы данных и создания соответствующих сценариев, которые выполняют эти операции. Вы можете найти эти и другие примеры в проекте Java EE Samples, размещенном на Github.
Ограничения
Как я уже упоминал ранее, я рекомендую использовать эти свойства только в целях разработки или тестирования. Неправильная настройка может легко уничтожить или связать вашу производственную базу данных.
Нет действий по обновлению или проверке схемы. Я не смог найти причину, по которой они не вошли в спецификацию, но вот проблема с предложением по улучшению.
Действия схемы базы данных выполняются только при развертывании приложения в среде Java EE. Для разработки вам может потребоваться выполнить действия при перезапуске сервера.
Служба поддержки
Оба Hibernate и EclipseLink , которые в комплекте с Wildfly и Glassfish поддерживают эти свойства.
OpenJPA , в настоящее время не поддерживает эти свойства, но я работаю в поддержке OpenJPA для стандартной генерации схемы. Если вам интересно или вы хотите следить за прогрессом, посмотрите мой репозиторий Github здесь . На самом деле это было моей основной мотивацией для написания этого поста, так как я немного вовлечен в реализацию этой функции.
Надеюсь, вам понравился пост 🙂
Ссылка: | Генерация схемы базы данных JPA от нашего партнера по JCG Роберто Кортеса в блоге |