Расположение XML-файла сохраняемости JPA
Традиционно файл persistence.xml находится в папке META-INF
, которая должна находиться в корне пути к классам Java. Если вы используете Maven, вы можете сохранить его в папке resources
, например так:
src/main/resources/META-INF/persistence.xml
XML-файловая структура персистентности JPA
Файл конфигурации `persistence.xml имеет следующую структуру:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit
name="HypersistenceOptimizer"
transaction-type="JTA">
<description>
Hypersistence Optimizer is a dynamic analyzing tool that can scan
your JPA and Hibernate application and provide you tips about the
changes you need to make to entity mappings, configurations, queries,
and Persistence Context actions to speed up your data access layer.
</description>
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:global/jdbc/default</jta-data-source>
<properties>
<property
name="hibernate.transaction.jta.platform"
value="SunOne"
/>
</properties>
</persistence-unit>
</persistence>
Тег persistence
является корневым элементом XML и определяет версию JPA и схему XML, используемую для проверки файла конфигурации persistence.xml
.
единица персистентности
Элемент persistence-unit
определяет имя связанного JPA Persistence Unit, которое впоследствии можно будет использовать для ссылки на него при использовании аннотации @PersistenceUnit
JPA для внедрения связанного экземпляра EntityManagerFactory
:
@PersistenceUnit(name = "HypersistenceOptimizer")
private EntityManagerFactory entityManagerFactory;
Атрибут transaction-type
определяет стратегию транзакций JPA и может принимать одно из следующих двух значений:
Традиционно приложения Java EE использовали JTA по умолчанию, что требует наличия диспетчера транзакций JTA, который использует протокол 2PC (двухфазная фиксация) для атомарного применения изменений к нескольким источникам данных (например, системам баз данных, очередям JMS, кэшам).
Если вы хотите распространить изменения на один источник данных, вам не нужен JTA, поэтому тип транзакции RESOURCE_LOCAL
является гораздо более эффективной альтернативой. Например, по умолчанию приложения Spring используют RESOURCE_LOCAL
транзакций, а чтобы использовать JTA
, вам нужно явно выбрать JtaTranscationManager
bean-компонент Spring.
описание
Элемент description
позволяет вам предоставить более подробную информацию о целях текущей единицы постоянства.
провайдер
XML-элемент provider
определяет полное имя класса, реализующего интерфейс JPA PersistenceProvider
.
Если вы используете Hibernate 4.3 или более новые версии, вам нужно использовать имя класса org.hibernate.jpa.HibernatePersistenceProvider
.
Если вы используете Hibernate 4.2 или более ранние версии, вместо этого вам нужно использовать имя класса org.hibernate.ejb.HibernatePersistence
.
jta-источник данных и не-jta-источник данных
Очень необычно, что спецификация JPA определяет два разных тега XML для предоставления имени JNDI DataSource
. Для этого должен был быть один атрибут data-source
, поскольку transaction-type
уже указывает, используется JTA или нет.
Нет, если вы используете JTA, вы можете использовать jta-data-source
, чтобы указать имя JNDI для связанного JTA DataSource
, а для RESOURCE_LOCAL
вам нужно использовать non-jta-data-source
.
Если вы используете Hibernate, вы также можете использовать свойство конфигурации hibernate.connection.datasource
, чтобы указать используемый JDBC DataSource
.
характеристики
Элемент properties
позволяет определить свойства JPA или специфичные для провайдера JPA для настройки:
Настройки сопоставления сущностей
По умолчанию Hibernate способен находить классы сущностей JPA на основе наличия аннотации @Entity
, поэтому вам не нужно объявлять классы сущностей.
exclude-unlisted-classes
Однако, если вы хотите явно указать используемые классы сущностей и исключить любые другие классы сущностей, найденные в текущем пути к классам Java, вам необходимо установить для элемента exclude-unlisted-classes
значение true
:
<exclude-unlisted-classes>true</exclude-unlisted-classes>
class
После установки XML-элемента exclude-unlisted-classes
выше необходимо указать список классов сущностей, зарегистрированных текущим Persistence Unit, с помощью XML-элемента class
:
<class>io.hypersistence.optimizer.forum.domain.Post</class>
<class>io.hypersistence.optimizer.forum.domain.PostComment</class>
<class>io.hypersistence.optimizer.forum.domain.PostDetails</class>
<class>io.hypersistence.optimizer.forum.domain.Tag</class>
Подавляющее большинство приложений JPA и Hibernate используют аннотации для создания метаданных объектно-реляционного сопоставления. Однако, даже если вы используете аннотации, вы все равно можете использовать XML-сопоставления для переопределения метаданных статических аннотаций метаданными, предоставленными через файл конфигурации orm.xml
.
Например, вы можете использовать генератор идентификаторов SEQUENCE
по умолчанию с аннотацией @SequenceGenerator
и заменить его на IDENTITY
для MySQL, который не поддерживает последовательности базы данных.
mapping-file
По умолчанию файл конфигурации orm.xml
находится в папке META-INF
. Если вы хотите использовать другое местоположение файла, вы можете использовать XML-элемент mapping-file
в файле persistence.xml
, например:
<mapping-file>file:///D:/Vlad/Work/Examples/mappings/orm.xml</mapping-file>
jar-file
По умолчанию поставщик JPA будет сканировать текущий путь к классам Java, чтобы загрузить классы сущностей или сопоставления XML. Если вы хотите предоставить для сканирования один или несколько файлов JAR, вы можете использовать элемент jar-file
, например:
<jar-file>lib/hypersistence-optimizer-glassfish-hibernate-example.jar</jar-file>
режим общего кэша
Элемент shared-cache-mode
позволяет определить стратегию SharedCacheMode
. для хранения сущностей в кэше второго уровня и может принимать одно из следующих значений:
ALL
— сохраняет все сущности в кэше второго уровня,
NONE
- сущности не сохраняются в кэше второго уровня,
ENABLE_SELECTIVE
- по умолчанию не кешируется никакая сущность, кроме тех, которые помечены аннотацией @Cacheable(true)
, которые будут кешироваться
DISABLE_SELECTIVE
- по умолчанию кешируются все сущности, кроме отмеченных аннотацией @Cacheable(false)
UNSPECIFIED
— использует стратегию кэширования провайдера JPA по умолчанию. Это также значение по умолчанию, которое используется, когда элемент shared-cache-mode
не установлен.
Вы также можете переопределить стратегию shared-cache-mode
программно, используя свойство javax.persistence.cache.storeMode
, например:
EntityManagerFactory entityManagerFactory = Persistence
.createEntityManagerFactory(
"HypersistenceOptimizer",
Collections.singletonMap(
"javax.persistence.cache.storeMode",
SharedCacheMode.ENABLE_SELECTIVE
)
);
режим проверки
Элемент XML validation-mode
определяет стратегию ValidationMode
, которая указывает провайдеру JPA, следует ли ему проверять объекты Bean Validation во время выполнения.
Элемент validation-mode
может принимать следующие значения:
AUTO
— Если в текущем пути к классам Java найден поставщик проверки компонентов, он будет зарегистрирован автоматически, и все объекты будут проверены. Если поставщик проверки компонентов не найден, объекты не проверяются. Это значение по умолчанию.
CALLBACK
— Сущности всегда должны проверяться поставщиком проверки компонентов. Если провайдер JPA не найдет реализацию Bean Validation в пути к классам, процесс начальной загрузки завершится ошибкой.
NONE
— Сущности не проверяются, даже если в пути к классам найден поставщик проверки компонентов.
Вы также можете переопределить стратегию validation-mode
программно, используя свойство javax.persistence.validation.mode
, например:
EntityManagerFactory entityManagerFactory = Persistence
.createEntityManagerFactory(
"HypersistenceOptimizer",
Collections.singletonMap(
"javax.persistence.validation.mode",
ValidationMode.CALLBACK
)
);
person
Vlad Mihalcea
schedule
10.03.2020
persistence.xml
. - person Vineet Reynolds   schedule 31.08.2011