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>
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>
これは非常に一般的な質問なので、この答えを
persistence.xml
ファイルの設定方法を説明するガイド に変えることにしました。
従来、persistence.xmlはMETA-INF
フォルダーにあり、Javaクラスパスのルートにある必要があります。Mavenを使用している場合は、resources
フォルダ、このように:
src/main/resources/META-INF/persistence.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の名前を定義します。これは、後で@PersistenceUnit
JPAアノテーションを使用して関連付けられた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
クラス名を使用する必要があります。
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
構成プロパティを使用して、使用するJDBCDataSource
を指定することもできます。
properties
要素を使用すると、JPAまたはJPAプロバイダー固有のプロパティを定義して以下を構成できます。
Dialect
org.hibernate.cfg.AvailableSettings
インターフェースで見つけることができる多くのプロパティ。デフォルトでは、Hibernateは@Entity
アノテーションの存在に基づいてJPAエンティティークラスを見つけることができるため、エンティティークラスを宣言する必要はありません。
ただし、使用するエンティティクラスを明示的に設定し、現在のJavaクラスパスで見つかった他のエンティティクラスを除外する場合は、exclude-unlisted-classes
要素を次の値に設定する必要があります。 true
:
<exclude-unlisted-classes>true</exclude-unlisted-classes>
上記のexclude-unlisted-classes
XML要素を設定した後、class
XML要素を介して現在の永続性ユニットによって登録されたエンティティクラスのリストを指定する必要があります。
<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.xml
XML要素を使用できます。
<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
)
);