ヘッダーをスキップ
Oracle® Fusion Middleware Oracle TopLinkソリューション・ガイド
11g リリース1 (11.1.1)
B66616-01
  目次へ移動
目次

前
 
次
 

10 HibernateからTopLinkへの移行

この章では、HibernateのJPA注釈およびネイティブな独自のAPIを使用するアプリケーションをTopLinkのJPAを使用するように移行する方法を説明します。この移行には、Hibernateの注釈をTopLinkのネイティブ注釈に移行すること、およびHibernateのネイティブAPIをTopLinkのJPAにアプリケーションのコードで変換することが関係しています。標準のJPA注釈およびAPIは変更されません。

この章には次の項が含まれます:

10.1 Hibernateの理解

Hibernateは、Java環境のためのオブジェクト・リレーショナル・マッピング・ツールです。これは、Javaオブジェクトをリレーショナル・データベース・アーティファクトにマッピングしたり、Javaのデータ型をSQLのデータ型にマッピングしたりするためのフレームワークを提供します。また、データベースに問い合せて、データを取得することもできます。

Hibernateの詳細は、http://www.hibernate.orgを参照してください。

移行する理由

HibernateからTopLinkに移行する理由には、次のようなものがあります。

10.2 主なタスク

Hibernateを永続性プロバイダとして使用するアプリケーションをOracle TopLinkに移行するには、次のタスクを実行します。

10.2.1 タスク1: Hibernateのエンティティ注釈の変換

org.hibernate.annotations.Entityクラスで定義されているHibernateのエンティティ注釈には、JPAの標準@Entity注釈で定義されている内容を超えるメタデータが追加されています。

例10-1に、Hibernateのエンティティ注釈のサンプルを示します。この例では、selectBeforeUpdatedynamicInsertdynamicUpdateoptimisticLockおよび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

10.2.1.1 Select Before Update、Dynamic InsertおよびUpdate属性の変換

HibernateでselectBeforeUpdate属性を指定すると、オブジェクトが実際に変更されたことが確実な場合以外、HibernateはSQL UPDATEを実行しません。dynamicInsert属性を指定すると、INSERT SQLが実行時に生成されて、null以外の値の列のみが格納されます。dynamicUpdate属性を指定すると、UPDATE SQLが実行時に生成されて、値が変更された列のみを格納できます。

TopLinkのデフォルトでは、マップされたすべての列が常に挿入され、変更された列のみが更新されます。代替操作が必要な場合は、Javaコード、SQLまたはストアド・プロシージャを使用して、これらの操作に使用される問合せをカスタマイズできます。

10.2.1.2 Optimistic Lock属性の変換

Hibernateでは、optimisticLock属性によって、オプティミスティック・ロックの方式が決まります。

TopLinkのオプティミスティック・ロック機能では、Hibernateのすべてのロック・タイプに加えて他のタイプもサポートされています。表10-1に、Hibernateの@Entity(optimisticLock)属性からTopLinkのロッキング・ポリシーへの変換を示します。これらのポリシーは、TopLinkの@OptimisticLocking注釈またはTopLinkのorm.xmlファイルのどちらかで構成できます。詳細は、EclipseLinkドキュメントの『Using EclipseLink JPA Extensions for Optimistic Locking』を参照してください。

http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#Using_EclipseLink_JPA_Extensions_for_Optimistic_Locking

表10-1 HibernateのOptimisticLockからTopLinkのOptimisticLockingへの変換

HibernateのOptimisticLockタイプ 説明 EclipseLinkのOptimisticLocking

NONE

オプティミスティック・ロックなし

EclipseLinkはデフォルトでオプティミスティック・ロックなしになります。

VERSION

列バージョンを使用

JPA @Version注釈またはEclipseLinkの次の注釈を使用します。

@OptimisticLocking(type = OptimisticLockingType.VERSION_COLUMN)

DIRTY

変更された列を比較

JPA @Version注釈またはEclipseLinkの次の注釈を使用します。

@OptimisticLocking(type = OptimisticLockingType.CHANGED_COLUMNS)

ALL

すべての列を比較

EclipseLinkの次の注釈が使用されます

@OptimisticLocking(type = OptimisticLockingType.ALL_COLUMNS)


さらに、TopLinkでは、OptimisticLockingType.SELECTED_COLUMNS注釈を使用して、選択した列の特定のセットも比較できます。これにより、CHANGEDまたはALLの方式がニーズに合わない場合に、比較する必要がある重要な列を選択できます。

10.2.2 タスク2: Hibernateのカスタム・シーケンス・ジェネレータ注釈の変換

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

10.2.3 タスク3: Hibernateのマッピング注釈の変換

次の項では、Hibernateの様々な注釈をTopLinkの注釈に変換する方法を説明します。

10.2.3.1 @ForeignKey注釈の変換

Hibernateの@ForeignKey注釈では、スキーマ生成時に使用する外部キーの名前を定義できます。

TopLinkでは、妥当な名前が生成されますが、使用する名前を指定するための注釈やeclipselink-orm.xmlはサポートされていません。移行時には、TopLinkでスキーマ(DDL)コマンドをデータベースに直接生成するのではなく、スクリプト・ファイルに生成することをお薦めします。そうすれば、実行する前に、別の名前を使用するようにスクリプトをカスタマイズできます。


注意:

外部キー名はTopLinkでは実行時に使用されませんが、EclipseLinkがスキーマを削除しようとする場合には必要です。この場合、削除スクリプトをファイルに生成して、作成時に使用された外部キー名と一致するようにカスタマイズする必要があります。


10.2.3.2 @Cache注釈の変換

Hibernateでは、@Cache注釈によって、エンティティおよびリレーションシップのキャッシングを構成します。TopLinkでは、データ・キャッシュではなくエンティティ・キャッシュが使用されるので、リレーションシップは自動的にキャッシュされます。これらの場合、@Cache注釈を移行時に削除する必要があります。@Cache注釈がエンティティに使用されている場合は、TopLinkの@Cache注釈と同様の動作になります。@Cache注釈および同等のeclipselink-orm.xml構成値の詳細は、EclipseLinkドキュメントの『Eclipse User Guide on JPA Extensions』を参照してください。

http://wiki.eclipse.org/Using_EclipseLink_JPA_Extensions_%28ELUG%29#Using_EclipseLink_JPA_Extensions_for_Entity_Caching

10.2.4 タスク4: persistence.xmlファイルの変更

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.2.4.1 変更されたpersistence.xml

例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

10.2.4.2 データベースの削除および作成

本番環境では、通常はデータベースにスキーマが設定されています。永続性ユニットに定義されている次のプロパティは、例およびデモ用に適しています。これらのプロパティを指定すると、TopLinkでデータベース表が自動的に削除および作成されます。以前に存在した表は削除されます。

<property name="eclipselink.ddl-generation" value="drop-and-create-tables"/>
<property name="eclipselink.ddl-generation.output-mode" value="database"/>

10.2.5 タスク5: Hibernate APIからEclipseLink APIへの変換

表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 説明

cfg.Configuration

Persistence

セッション・ファクトリ(Hibernate内)またはエンティティ・マネージャ・ファクトリ(JPA内)を構成するブートストラップ・クラス。通常、これはJVM用の単一のセッション(またはエンティティ・マネージャ)ファクトリを作成するために使用します。

SessionFactory

EntityManagerFactory

Hibernateセッション(またはJPAエンティティ・マネージャ)をオープンして、ユーザー・リクエストを処理するためのAPIを提供します。一般に、セッション(またはエンティティ・マネージャ)は、クライアント・リクエストを処理するスレッドごとにオープンされます。

Session

EntityManager

エンティティをデータベースにストアまたはデータベースからロードするためのAPIを提供します。トランザクションを取得して問合せを作成するためのAPIも提供します。

Transaction

EntityTransaction

トランザクションを管理するためのAPIを提供します。

Query

Query

問合せを実行するためのAPIを提供します。


10.3 その他の参考資料

HibernateからEclipseLinkへの移行の詳細は、次のリンクのEclipseLink/Examples/JPA/Migration/Hibernateを参照してください。

http://wiki.eclipse.org/EclipseLink/Examples/JPA/Migration/Hibernate