この章では、HibernateのJPA注釈およびネイティブな独自のAPIを使用するアプリケーションをTopLinkのJPAを使用するように移行する方法を説明します。この移行には、Hibernateの注釈をTopLinkのネイティブ注釈に移行すること、およびHibernateのネイティブAPIをTopLinkのJPAにアプリケーションのコードで変換することが関係しています。標準のJPA注釈およびAPIは変更されません。
この章には次の項が含まれます:
Hibernateは、Java環境のためのオブジェクト・リレーショナル・マッピング・ツールです。これは、Javaオブジェクトをリレーショナル・データベース・アーティファクトにマッピングしたり、Javaのデータ型をSQLのデータ型にマッピングしたりするためのフレームワークを提供します。また、データベースに問い合せて、データを取得することもできます。
Hibernateの詳細は、http://www.hibernate.org
を参照してください。
移行する理由
HibernateからTopLinkに移行する理由には、次のようなものがあります。
パフォーマンスとスケーラビリティ: TopLinkのキャッシング・アーキテクチャでは、オブジェクトの作成を最小限に抑えて、インスタンスを共有できます。TopLinkのキャッシングでは、シングルノードおよびクラスタ化されたデプロイメントがサポートされています。
主要なリレーショナル・データベースのサポート: TopLinkでは、すべての主要なリレーショナル・データベースに固有の拡張機能が提供されて継続的にサポートされます。TopLinkはOracleデータベースに対する最高のORMソリューションでもあります。
包括的な永続性ソリューション: TopLinkには、業界をリードするオブジェクトリレーショナル・サポートが用意されていますが、さらにコア・マッピング機能も使用して、Object-XML (JAXB)、サービス・データ・オブジェクト(SDO)およびデータベースWebサービスが提供されています。要件に応じて、同じコア永続性エンジンに基づく永続性サービスを複数使用することもできます。
JPAサポート: JPA 1.0仕様が同じく業界をリードしているので、OracleとTopLink/EclipseLinkのチームは、JDeveloper、ADF、SpringおよびEclipse IDE (Daliプロジェクト)との統合をサポートするJPA準拠のソリューションを提供することに注力しています。OracleはJPA 1.0のリファレンス実装を提供し、EclipseLinkはJPA 2.0のリファレンス実装を提供します。Oracleは、標準ベースの開発に注力しながら、多くの高度な機能を引き続き提供しています。
Hibernateを永続性プロバイダとして使用するアプリケーションをOracle TopLinkに移行するには、次のタスクを実行します。
org.hibernate.annotations.Entity
クラスで定義されているHibernateのエンティティ注釈には、JPAの標準@Entity
注釈で定義されている内容を超えるメタデータが追加されています。
例10-1に、Hibernateのエンティティ注釈のサンプルを示します。この例では、selectBeforeUpdate
、dynamicInsert
、dynamicUpdate
、optimisticLock
およびpolymophism
属性が使用されています。Hibernateのエンティティ注釈には、この例には示されていないmutable
およびpersister
属性も定義されています。
例10-1 Hibernateのエンティティ注釈のサンプル
@org.hibernate.annotations.Entity( selectBeforeUpdate = true, dynamicInsert = true, dynamicUpdate = true, optimisticLock = OptimisticLockType.ALL, polymorphism = PolymorphismType.EXPLICIT)
次の項では、選択、動的更新と挿入、ロックおよび多相性をTopLinkが処理する方法を説明します。詳細は、Eclipselinkドキュメントの『EclipseLink/Examples/JPA/Migration/Hibernate/V3Annotations』を参照してください。
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Migration/Hibernate/V3Annotations
HibernateでselectBeforeUpdate
属性を指定すると、オブジェクトが実際に変更されたことが確実な場合以外、HibernateはSQL UPDATE
を実行しません。dynamicInsert
属性を指定すると、INSERT
SQL
が実行時に生成されて、null以外の値の列のみが格納されます。dynamicUpdate
属性を指定すると、UPDATE
SQL
が実行時に生成されて、値が変更された列のみを格納できます。
TopLinkのデフォルトでは、マップされたすべての列が常に挿入され、変更された列のみが更新されます。代替操作が必要な場合は、Javaコード、SQLまたはストアド・プロシージャを使用して、これらの操作に使用される問合せをカスタマイズできます。
Hibernateでは、optimisticLock
属性によって、オプティミスティック・ロックの方式が決まります。
TopLinkのオプティミスティック・ロック機能では、Hibernateのすべてのロック・タイプに加えて他のタイプもサポートされています。表10-1に、Hibernateの@Entity(optimisticLock)
属性からTopLinkのロッキング・ポリシーへの変換を示します。これらのポリシーは、TopLinkの@OptimisticLocking
注釈またはTopLinkのorm.xml
ファイルのどちらかで構成できます。詳細は、EclipseLinkドキュメントの『Using EclipseLink JPA Extensions for Optimistic Locking』を参照してください。
表10-1 HibernateのOptimisticLockからTopLinkのOptimisticLockingへの変換
HibernateのOptimisticLockタイプ | 説明 | EclipseLinkのOptimisticLocking |
---|---|---|
|
オプティミスティック・ロックなし |
EclipseLinkはデフォルトでオプティミスティック・ロックなしになります。 |
|
列バージョンを使用 |
JPA
|
|
変更された列を比較 |
JPA
|
|
すべての列を比較 |
EclipseLinkの次の注釈が使用されます
|
さらに、TopLinkでは、OptimisticLockingType.SELECTED_COLUMNS
注釈を使用して、選択した列の特定のセットも比較できます。これにより、CHANGED
またはALL
の方式がニーズに合わない場合に、比較する必要がある重要な列を選択できます。
Hibernateでは、@GeneratedValue
注釈によって、ID生成方式を定義します。@GenericGenerator
では、Hibernate固有のIDジェネレータを定義できます。例10-2は、シーケンス値のカスタム・ジェネレータを示しています。
例10-2 シーケンス値のカスタム・ジェネレータ
... @Id @GeneratedValue(generator = "system-uuid") @GenericGenerator(name = "system-uuid", strategy = "mypackage.UUIDGenerator") public String getTransactionGuid() ...
TopLinkでは、@GeneratedValue
注釈を使用して、カスタム・シーケンス・ジェネレータを実装および登録できます。詳細は、EclipseLinkドキュメントの『How to use Custom Sequencing (i.e., UUID)』を参照してください。
http://wiki.eclipse.org/EclipseLink/Examples/JPA/CustomSequencing
次の項では、Hibernateの様々な注釈をTopLinkの注釈に変換する方法を説明します。
Hibernateの@ForeignKey
注釈では、スキーマ生成時に使用する外部キーの名前を定義できます。
TopLinkでは、妥当な名前が生成されますが、使用する名前を指定するための注釈やeclipselink-orm.xml
はサポートされていません。移行時には、TopLinkでスキーマ(DDL)コマンドをデータベースに直接生成するのではなく、スクリプト・ファイルに生成することをお薦めします。そうすれば、実行する前に、別の名前を使用するようにスクリプトをカスタマイズできます。
注意: 外部キー名はTopLinkでは実行時に使用されませんが、EclipseLinkがスキーマを削除しようとする場合には必要です。この場合、削除スクリプトをファイルに生成して、作成時に使用された外部キー名と一致するようにカスタマイズする必要があります。 |
Hibernateでは、@Cache
注釈によって、エンティティおよびリレーションシップのキャッシングを構成します。TopLinkでは、データ・キャッシュではなくエンティティ・キャッシュが使用されるので、リレーションシップは自動的にキャッシュされます。これらの場合、@Cache
注釈を移行時に削除する必要があります。@Cache
注釈がエンティティに使用されている場合は、TopLinkの@Cache
注釈と同様の動作になります。@Cache
注釈および同等のeclipselink-orm.xml
構成値の詳細は、EclipseLinkドキュメントの『Eclipse User Guide on JPA Extensions』を参照してください。
persistence.xml
ファイルは、JPA永続性のデプロイメント・ディスクリプタ・ファイルです。ここには、永続性ユニットを指定し、管理対象永続性クラス、オブジェクト・リレーショナル・マッピング、およびデータベース接続の詳細を宣言します。例10-3に、Hibernateを使用するアプリケーションのpersistence.xml
ファイルを示します。
例10-3 Hibernateを使用するアプリケーションの永続性ファイル
<persistence> <persistence-unit name="helloworld"><provider>org.hibernate.ejb.HibernatePersistence</provider>
<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> </persistence-unit> </persistence>
例10-4に、TopLinkを使用するアプリケーション用に変更されたpersistence.xml
ファイルを示します。主な相違は、永続性プロバイダの値などです。TopLinkの場合は、この値は、org.eclipse.persistence.jpa.PersistenceProvider
です。TopLink固有のプロパティ名には、通常、eclipselink.target-database
のようにeclipselink
という接頭辞が付きます。
例10-4 EclipseLink用に変更された永続性ファイル
<xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" 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_1_0.xsd"> <persistence-unit name="helloworld"><provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>java:/DefaultDS</jta-data-source> <!-- Entities must be specified for EclipseLink weaving --> <class>Todo</class> <properties><property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
<property name="eclipselink.ddl-generation.output-mode" value="database"/>
<property name="eclipselink.weaving" value="false"/>
<property name="eclipselink.logging.level" value="FINE"/>
</properties> </persistence-unit> </persistence>
詳細は、EclipseLinkドキュメントの『EclipseLink/Examples/JPA/Migration/JBoss』を参照してください。
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Migration/JBoss
本番環境では、通常はデータベースにスキーマが設定されています。永続性ユニットに定義されている次のプロパティは、例およびデモ用に適しています。これらのプロパティを指定すると、TopLinkでデータベース表が自動的に削除および作成されます。以前に存在した表は削除されます。
<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> <property name="eclipselink.ddl-generation.output-mode" value="database"/>
表10-2で、JPAプロジェクトでよく使用されるHibernateクラスおよび同等のEclipseLink (JPA)インタフェースを説明します。Hibernateのすべてのクラスはorg.hibernate
パッケージにあります。すべてのJPAインタフェース(およびPersistence
クラス)はjavax.persistence
パッケージにあります。
EclipseLink APIの詳細は、『Oracle Fusion Middleware Java API Reference for EclipseLink』を参照してください。
表10-2 Hibernateのクラスおよび同等のJPAインタフェース
org.hibernate | javax.persistence | 説明 |
---|---|---|
|
|
セッション・ファクトリ(Hibernate内)またはエンティティ・マネージャ・ファクトリ(JPA内)を構成するブートストラップ・クラス。通常、これはJVM用の単一のセッション(またはエンティティ・マネージャ)ファクトリを作成するために使用します。 |
|
|
Hibernateセッション(またはJPAエンティティ・マネージャ)をオープンして、ユーザー・リクエストを処理するためのAPIを提供します。一般に、セッション(またはエンティティ・マネージャ)は、クライアント・リクエストを処理するスレッドごとにオープンされます。 |
|
|
エンティティをデータベースにストアまたはデータベースからロードするためのAPIを提供します。トランザクションを取得して問合せを作成するためのAPIも提供します。 |
|
|
トランザクションを管理するためのAPIを提供します。 |
|
|
問合せを実行するためのAPIを提供します。 |
HibernateからEclipseLinkへの移行の詳細は、次のリンクのEclipseLink/Examples/JPA/Migration/Hibernateを参照してください。
http://wiki.eclipse.org/EclipseLink/Examples/JPA/Migration/Hibernate