ヘッダーをスキップ
Oracle® Fusion Middleware Oracle TopLinkソリューション・ガイド
12c (12.1.2)
E47993-02
  目次へ移動
目次

前
 
次
 

8 HibernateからTopLinkへの移行

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

この章の内容は次のとおりです。

ユース・ケース

Hibernateを永続性プロバイダとして使用するかわりに、TopLinkを使用するようアプリケーションを移行を行いたいと開発者が考えています。

解決方法

この章の手順に従って、アプリケーションをアップグレードします。

コンポーネント

8.1 ソリューションの概要

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

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

移行の理由

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

8.2 主なタスク

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

8.2.1 タスク1: 前提条件

TopLink 12cリリース1 (12.1.2)以上。

http://www.oracle.com/technetwork/middleware/toplink/downloads/index.htmlからTopLinkをダウンロードします。

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

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

例8-1に、Hibernateのエンティティ注釈のサンプルを示します。この例では、selectBeforeUpdatedynamicInsertdynamicUpdateoptimisticLockおよびpolymophism属性が使用されています。Hibernateのエンティティ注釈には、この例には示されていないmutableおよびpersister属性も定義されています。

例8-1 Hibernateのエンティティ注釈のサンプル

@org.hibernate.annotations.Entity(
     selectBeforeUpdate = true,
     dynamicInsert = true, 
     dynamicUpdate = true,
     optimisticLock = OptimisticLockType.ALL,
     polymorphism = PolymorphismType.EXPLICIT)

次の項では、選択、ロック、多相性、動的更新および挿入をEclipseLinkが処理する方法を説明します。詳細は、Eclipselinkのドキュメントの「EclipseLink/Examples/JPA/Migration/Hibernate/V3Annotations」を参照してください。

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

8.2.2.1 SelectBeforeUpdate、dynamicInsertおよびdynamicUpdate属性の変換

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

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

8.2.2.2 OptimisticLock属性の変換

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

EclipseLinkのオプティミスティック・ロック機能では、Hibernateのすべてのロック・タイプに加えて他のタイプもサポートされています。表8-1に、Hibernateの@Entity(optimisticLock)属性に対応するEclipseLinkのロッキング・ポリシーを示します。これらのポリシーは、EclipseLinkの@OptimisticLocking注釈またはEclipseLinkのorm.xmlファイルのどちらかで構成できます。詳細は、@OptimisticLockingを参照してください。

表8-1 Hibernateのオプティミスティック・ロックからEclipseLinkのオプティミスティック・ロックへの変換

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)


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

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

Hibernateでは、@GeneratedValue注釈によって、ID生成戦略を定義します。@GenericGeneratorでは、Hibernate固有のIDジェネレータを定義できます。例8-2は、シーケンス値のカスタム・ジェネレータを示しています。

例8-2 シーケンス値のカスタム・ジェネレータ

.
.
.
@Id
   @GeneratedValue(generator = "system-uuid")
   @GenericGenerator(name = "system-uuid", strategy = "mypackage.UUIDGenerator")
   public String getTransactionGuid()
.
.
.
 

EclipseLinkでは、@GeneratedValue注釈を使用して、カスタム・シーケンス・ジェネレータを実装および登録できます。詳細は、次のEclipseLinkのドキュメントのカスタム・シーケンスの使用方法に関する項を参照してください。

http://wiki.eclipse.org/EclipseLink/Examples/JPA/CustomSequencing

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

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

8.2.4.1 @ForeignKey注釈の変換

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

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


注意:

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


8.2.4.2 @Cache注釈の変換

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

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

persistence.xmlファイルは、JPA永続性のデプロイメント・ディスクリプタ・ファイルです。ここには、永続性ユニットを指定し、管理対象永続性クラス、オブジェクト・リレーショナル・マッピング、およびデータベース接続の詳細を宣言します。例8-3に、Hibernateを使用するアプリケーションのpersistence.xmlファイルを示します。Hibernateに固有の値は、太字のフォントで示します。

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

8.2.5.1 変更されたpersistence.xmlファイル

例8-4に、EclipseLinkを使用するアプリケーション用に変更されたpersistence.xmlファイルを示します。主な相違は、永続性プロバイダの値などです。EclipseLinkの場合は、この値は、org.eclipse.persistence.jpa.PersistenceProviderです。EclipseLink固有のプロパティ名には、通常、eclipselink.target-databaseのようにeclipselinkという接頭辞が付きます。EclipseLinkに固有の値は、太字のフォントで示します。

例8-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>
    <!-- For Java SE applications, entity classes must be specified for EclipseLink weaving. For Java EE applications, the classes are found automatically. -->
    <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.logging.level" value="FINE"/>
    </properties>
  </persistence-unit>
</persistence> 

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

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

データベース表の削除および作成機能を使用するには、次のプロパティをpersistence.xmlファイルに追加します。

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

この機能の詳細は、『Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス』のddl-generationに関する項のdrop-and-create-tablesのエントリを参照してください。

8.2.5.3 データベース表の作成または拡張

データベース表の作成または拡張機能では、新しいデータベース表を作成したり、既存の表を変更することによって、データベース・スキーマとオブジェクト・モデルを一致させることができます。フィールド名の変更を指定したり、フィールドを追加および削除することによって、既存の表を変更できます。


注意:

現在のリリースでは、データベース表の作成または拡張機能では、既存の列を名前変更したり削除できません。欠落している表の列のみを追加できます。


データベース表の作成または拡張機能では、テスト・データを再移入する必要を減らせます。オブジェクト・モデルの変更により、スキーマの変更時に、データベース表の削除および作成機能の使用を回避できます。また、データベース表の作成または拡張機能では、表の列を追加する拡張も使用できます。

データベース表の作成または拡張機能を使用するには、次のプロパティをpersistence.xmlファイルに追加します。コンテキストがロードされたら、永続性ユニットで必要とされる各表のデータベースに対し、EclipseLinkが問合せを行い、その結果を使用して表を作成または拡張する必要があるか判断されます。

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

この機能の詳細は、『Oracle TopLink Java Persistence API (JPA)拡張機能リファレンス』のddl-generationに関する項のcreate-or-extend-tablesのエントリを参照してください。

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

表8-2で、JPAプロジェクトでよく使用されるHibernateクラスおよび同等のEclipseLink (JPA)インタフェースを説明します。Hibernateのすべてのクラスはorg.hibernateパッケージにあります。すべてのJPAインタフェース(およびPersistenceクラス)はjavax.persistenceパッケージにあります。

EclipseLinkのAPI の詳細は、『Oracle TopLink Java APIリファレンス』を参照してください。

表8-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を提供します。


8.3 その他の参考資料

この章のソリューションが実装されているその他のテクノロジおよびツールの詳細は、次の参考資料を参照してください。