Как создать файл persistence.xml для JPA и Hibernate?

Я пытаюсь использовать Hibernate JPA, но мне нужно создать свой файл persistence.xml (чтобы я мог правильно использовать диспетчер сущностей). Я не уверен, что создать и где это разместить.

Вот как настроен мой hibernate.cfg.xml в «основном» режиме. Я использую веб-разработчиков Eclipse Java EE IDE (выпуск Indigo):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.password">XXXXXX</property>
        <property name="hibernate.connection.url">jdbc:mysql://<hostname>/<database></property>
        <property name="hibernate.connection.username">XXXXX</property>
        <property name="hibernate.default_schema">XXXXXX</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    </session-factory>
</hibernate-configuration>

person Valter Silva    schedule 31.08.2011    source источник
comment
Какой проект вы создали в Eclipse? Это проект JPA? Если вы создали проект JPA, он должен иметь файл persistence.xml.   -  person Vineet Reynolds    schedule 31.08.2011
comment
@Vineet Reynolds, мой проект - это динамический веб-проект в Eclips Web Java EE Developers, я не нашел в нем никакого файла persistence.xml.   -  person Valter Silva    schedule 01.09.2011
comment
этот пост помогает мне: stackoverflow.com/questions/703043/   -  person Valter Silva    schedule 03.09.2011


Ответы (2)


Создайте файл persistence.xml, который находится в папке META-INF.

Пример:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
         version="2.0">
<persistence-unit name="sample">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <jta-data-source>java:/DefaultDS</jta-data-source>
  <mapping-file>ormap.xml</mapping-file>
  <jar-file>MyApp.jar</jar-file>
  <class>org.acme.Employee</class>
  <class>org.acme.Person</class>
  <class>org.acme.Address</class>
  <properties>
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
     <property name="hibernate.connection.password">XXXXXX</property>
     <property name="hibernate.connection.url">jdbc:mysql://<hostname>/<database></property>
     <property name="hibernate.connection.username">XXXXX</property>
     <property name="hibernate.default_schema">XXXXXX</property>
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
   </properties>
  </persistence-unit>
</persistence>
person nir    schedule 11.09.2013
comment
Другой вариант — установить свойство packagesToScan в конфигурации Spring, например: property name=packagesToScan› ‹list› ‹value›be.webworks.webshop.service.infra.persistence‹/value› ‹/list› ‹/property› ‹/bean› ‹/code› ТО вам не нужно хранить persistence.xml в актуальном состоянии или создавать его каждый раз. - person Lawrence; 30.09.2016
comment
Атрибут «значение» кажется обязательным в xsd, вы уверены, что этот пример верен? - person Koray Tugay; 16.10.2016
comment
@KorayTugay Этот ответ на три года старше вашего комментария. Они изменили синтаксис тегов, так что теперь это значение требуется. :) <property name="javax.persistence.schema-generation.database.action" value="create" /> как пример. - person alexander; 15.05.2019

Расположение 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 и может принимать одно из следующих двух значений:

  • JTA
  • RESOURCE_LOCAL

Традиционно приложения 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