EJB 3.0(Public Draft)入門記 Java Persistence API Chapter6 その2

むー、なかなかすすまないです。今日はpersistence.xmlの説明。

6.2.1 persistence.xml file

persistence.xmlはparファイルのMETA-INFディレクトリにおかれるファイルです。persistence.xmlでは次のものが定義されます。

  • EntityManagerとEntityManagerFactoryに対する設定
  • 永続ユニットで管理されるクラス
  • 永続ユニットに対するO/Rマッピング情報


O/Rマッピング情報の形式には次のものがあるそうです。

  • parファイルに含まれるクラスのアノテーション
  • parファイルに含まれるひとつ以上のXMLファイル
  • parファイルに含まれないひとつ以上のXMLファイル。XMLファイルはparファイルから参照されクラスパス上にある。
  • 上記の組み合わせ

O/Rマッピングの情報はアノテーションでもXMLでも書けるよ、XMLファイルはparに含めても含めなくてもいいよ、ってことです。


永続ユニットで管理されるクラスを示すには次の方法があるようです。

  • parファイルにクラスを含める
  • クラスパス上のクラスやjarやXMLファイルの名称を指定する

エンティティクラスはparに含めたり、jarに含めたりXMLで指定したりできるよってことですね。


persistence.xmlの例を写してみます。

<entity-manager>
   <name>em1</name>
   <provider>com.acme.persistence</provider>
   <jta-data-source>jdbc/MyDB</jta-data-source>
   <mapping-file>ormap.xml</mapping-file>
   <jar-file>MyApp.jar</jar-file>
   <class>com.wedgets.Order</class>
   <class>com.wedgets.Customer</class>
   <properties>
      <property name="sql-logging" value="on"/>
   </properties>
</entity-manager>

ちなみに、Embeddable EJB 3.0のpersistence.xmlはこうなっています。

<?xml version="1.0" encoding="UTF-8"?>
<entity-manager>
   <name>custdb</name>
   <jta-data-source>java:/DefaultDS</jta-data-source>
   <properties>
      <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
   </properties>
</entity-manager

Embeddable EJB 3.0ではpersistence.xmlを使ってますがparファイルは作らなくてもOKです。EJB3StandaloneBootstrapを使ってpersistence.xmlの場所を指定したり、META-INFの下においておくことで勝手に読み込ませたりできます。


次に各要素の説明。

6.2.1.1 name
EntityManagerの名前です。指定されない場合はpersistence.xmlを含むparファイルの名前(拡張子は含めない)が使われるそうです。たとえばOrderEntities.parというparファイルならばOrderEntitiesがEntityManagerの名前になるらしいです。

6.2.1.2 provider
永続プロパイダのjavax.persistence.spi.PersistenceProviderの名前です。サードパーティの永続プロバイダの実装を使う場合は指定必須。
指定しない場合はどうなるんだろ。アプリケーションサーバのデフォルトの永続プロパイダが使われる?

6.2.1.3 jta-data-source, non-jta-data-source
JTAとnon-JTAのデータソースのグローバルなJNDIの名前が指定されます。名前の付け方は製品固有だそうです。

6.2.1.4 mapping-file, jar-file, class
永続ユニットに管理されるクラスの集合は次のものを使って定義されます。

  • O/RマッピングXMLファイル (mapping-file要素で指定)
  • jarファイル (jar-file要素で指定)
  • クラスの明示的な一覧 (class要素で指定)
  • parファイルに含まれるクラス

mapping-file要素を使ってparファイル外部のXMLファイルを参照できますが、entity-mappings.xmlをparファイルのMETA-INFの下においてもいいみたい。entity-mappings.xmlは標準のマッピングファイルのようです。書き方は決まっているのかな? 言及されていないような...。

6.2.1.5 properties
永続ユニットやEntityManagerFactoryの設定に適用されるベンダ固有のプロパティ。ここにjavax.persistenceやjavax.persistenceに属する名前空間を使ってはいけないとか。javax.persistenceは将来の仕様のために予約されているそうです。

6.2.1.6 Examples
例がいろいろ。まあ、とばしてもいいか。

6.2.2 Default EntityManager

persistence.xmlを持たないparファイルはデフォルト値で設定された永続ユニットを持つそうです。これはpersistence.xmlに空のentity-manager要素を指定するのと同じみたい。これは次のことを意味するそうです。

  • デフォルトの名前を使う。(parファイルの拡張子を除いた名前)
  • parに含まれていればentity-mappings.xmlを使う
  • parに含まれていれば含まれているエンティティクラスや組み込みのクラスを使う

6.3 Deployment

parはapplication.xmlに指定されるか、earファイル処理中に発見?されるかするそうです。parファイルが見つかった場合、META-INF/persistence.xmlが見つかればそれを使い、見つからなければデフォルトの設定(6.2.2で説明されている設定)を使うそうです。


この前の休みのときに、NetBeans + JBossとか試してみよかなーとか思ったんですけど、まだです。余裕がなくて。今週末こそは...って週末休めるのかなぁ。