web-dev-qa-db-ja.com

Hibernate JPAのpersistence.xmlファイルを作成するにはどうすればよいですか?

Hibernate JPAを使用しようとしていますが、persistence.xmlを作成する必要があります(エンティティマネージャーを正しく使用できるようにするため)。何を作成し、どこに配置するのかわかりません。

これは、「コア」モードのhibernate.cfg.xmlの構成方法です。私が使用しているもの:Eclipse Java EE IDE Web Developers version:Indigo Release

<?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>
8
Valter Silva

META-INFフォルダーにあるpersistence.xmlファイルを作成します。

例:

<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>
8
nir

これは非常に一般的な質問なので、この答えを persistence.xmlファイルの設定方法を説明するガイド に変えることにしました。

JPA永続性XMLファイルの場所

従来、persistence.xmlはMETA-INFフォルダーにあり、Javaクラスパスのルートにある必要があります。Mavenを使用している場合は、resourcesフォルダ、このように:

src/main/resources/META-INF/persistence.xml

JPA永続性XMLファイルの構造

`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要素であり、persistence.xml構成ファイルの検証に使用されるJPAバージョンとXMLスキーマを定義します。

永続性ユニット

persistence-unit要素は、関連付けられたJPA Persistence Unitの名前を定義します。これは、後で@PersistenceUnitJPAアノテーションを使用して関連付けられたEntityManagerFactoryインスタンスを挿入するときに参照するために使用できます。

@PersistenceUnit(name = "HypersistenceOptimizer")
private EntityManagerFactory entityManagerFactory;

transaction-type属性はJPAトランザクション戦略を定義し、次の2つの値のいずれかを取ります。

  • JTA
  • RESOURCE_LOCAL

従来、Java EEアプリケーションはデフォルトでJTAを使用していました。これには、2PC(2フェーズコミット)プロトコルを使用して変更を複数のデータソース(データベースなど)にアトミックに適用するJTAトランザクションマネージャーが必要です。システム、JMSキュー、キャッシュ)。

変更を単一のデータソースに伝播する場合は、JTAは必要ないため、RESOURCE_LOCALトランザクションタイプがはるかに効率的な代替手段です。たとえば、デフォルトでは、SpringアプリケーションはRESOURCE_LOCALトランザクションを使用し、JTAを使用するには、JtaTranscationManager Spring Beanを明示的に選択する必要があります。

説明

description要素を使用すると、現在の永続性ユニットの目標に関する詳細を提供できます。

プロバイダー

provider XML要素は、JPA PersistenceProviderインターフェースを実装する完全修飾クラス名を定義します。

Hibernate 4.3以降のバージョンを使用している場合は、org.hibernate.jpa.HibernatePersistenceProviderクラス名を使用する必要があります。

Hibernate 4.2以前のバージョンを使用している場合は、代わりにorg.hibernate.ejb.HibernatePersistenceクラス名を使用する必要があります。

jta-data-sourceおよびnon-jta-data-source

JPA仕様がJNDI DataSource名を提供するために2つの異なるXMLタグを定義することは非常に珍しいことです。 data-sourceはすでにJTAを使用するかどうかを指定しているため、そのための単一のtransaction-type属性が必要でした。

いいえ、JTAを使用している場合は、jta-data-sourceを使用して、関連付けられているJTA DataSourceのJNDI名を指定できますが、RESOURCE_LOCALの場合は、non-jta-data-sourceを使用する必要があります。

Hibernateを使用している場合は、hibernate.connection.datasource構成プロパティを使用して、使用するJDBC DataSourceを指定することもできます。

プロパティ

properties要素を使用すると、JPAまたはJPAプロバイダー固有のプロパティを定義して以下を構成できます。

エンティティマッピング設定

デフォルトでは、Hibernateは@Entityアノテーションの存在に基づいてJPAエンティティークラスを見つけることができるため、エンティティークラスを宣言する必要はありません。

ただし、使用するエンティティクラスを明示的に設定し、現在のJavaクラスパスで見つかった他のエンティティクラスを除外する場合は、exclude-unlisted-classes要素を次の値に設定する必要があります。 true

<exclude-unlisted-classes>true</exclude-unlisted-classes>

上記のexclude-unlisted-classesXML要素を設定した後、classXML要素を介して現在の永続性ユニットによって登録されたエンティティクラスのリストを指定する必要があります。

<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構成ファイルを介して提供されたものでオーバーライドできます。

たとえば、デフォルトでは@SequenceGeneratorアノテーションを使用して SEQUENCE識別子ジェネレータ を使用し、データベースシーケンスをサポートしないMySQLの場合はIDENTITYに置き換えることができます。

このトピックの詳細については、 この記事 を確認してください。

デフォルトでは、orm.xml構成ファイルはMETA-INFフォルダーにあります。別のファイルの場所を使用する場合は、次のように、mapping-fileファイルのpersistence.xmlXML要素を使用できます。

<mapping-file>file:///D:/Vlad/Work/Examples/mappings/orm.xml</mapping-file>

外部のorm.xmlファイルを使用してXML形式でJPAマッピングを提供する方法の詳細については、 この記事 を確認してください。

デフォルトでは、JPAプロバイダーは現在のJavaクラスパスをスキャンしてエンティティークラスまたはXMLマッピングをロードします。スキャンする1つ以上のJARファイルを提供する場合は、jar-fileを使用できます。このような要素:

<jar-file>lib/hypersistence-optimizer-glassfish-hibernate-example.jar</jar-file>

共有キャッシュモード

shared-cache-mode要素を使用すると、エンティティを第2レベルのキャッシュに格納するための SharedCacheMode 戦略を定義でき、次のいずれかの値を取ることができます。

  • ALL-すべてのエンティティを第2レベルのキャッシュに保存します。
  • NONE-エンティティは第2レベルのキャッシュに保存されません。
  • 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
    )
);

検証モード

validation-mode XML要素は ValidationMode 戦略を指定します。これは、実行時にエンティティBeanValidationをチェックする必要があるかどうかをJPAプロバイダーに指示します。

validation-mode要素は、次の値を取ることができます。

  • AUTO-現在のJavaクラスパスでBeanValidationプロバイダーが見つかった場合、それは自動的に登録され、すべてのエンティティが検証されます。BeanValidationプロバイダーがない場合見つかった場合、エンティティは検証されません。これはデフォルト値です。
  • CALLBACK-エンティティは常にBean Validationプロバイダーによって検証される必要があります。 JPAプロバイダーがクラスパスでBeanValidation実装を見つけられなかった場合、bootstrapプロセスは失敗します。
  • NONE-Bean Validationプロバイダーがクラスパスで見つかった場合でも、エンティティは検証されません。

次のように、validation-modeプロパティを使用してプログラムでjavax.persistence.validation.mode戦略をオーバーライドすることもできます。

EntityManagerFactory entityManagerFactory = Persistence
.createEntityManagerFactory(
    "HypersistenceOptimizer", 
    Collections.singletonMap(
        "javax.persistence.validation.mode",
        ValidationMode.CALLBACK
    )
);
1
Vlad Mihalcea