Java Persistence API 2.1 の動作の変更

アプリケーションで jpa-2.0 フィーチャーを既に使用している場合、マイグレーションの問題を避けるために、既存のアプリケーションで引き続き jpa-2.0フィーチャーを使用してください。新しいアプリケーションの場合は、jpa-2.1 フィーチャーを使用することが最良です。これにより、JPA 2.1 仕様で使用可能な新しい機能を利用できます。jpa-2.0 フィーチャーではなく jpa-2.1 フィーチャーを使用するように既存のアプリケーションを変更する場合は、マイグレーション・プロセスでアプリケーションを調整する必要が生じることがあります。

jpa-2.0jpa-2.1 の差異

jpa-2.0jpa-2.1 フィーチャーのいくつかの大きな差異を認識しておく必要があります。以下を参照してください。

PersistenceProvider クラス名の差異
jpa-2.0
  • IBM® プロバイダー:com.ibm.websphere.persistence.PersistenceProviderImpl
  • OpenJPA プロバイダー: org.apache.openjpa.persistence.PersistenceProviderImpl
jpa-2.1
  • org.eclipse.persistence.jpa.PersistenceProvider
キャッシュ動作の差異

jpa-2.0: デフォルトでは、キャッシュは無効になっています。 アプリケーションが L2 キャッシュを利用する必要がある場合は、明示的にそれを有効にする必要があります。

jpa-2.1: デフォルトでは、EclipseLink プロバイダーで L2 キャッシュと QueryCache が有効になっています。この設定がご使用のアプリケーションで最適なオプションなのかを確認する必要があります。クラスターなどの分散環境で実行している場合、キャッシュを無効にするか、ノードごとにデータが異なる可能性があることを理解している必要があります。

機能拡張/ウィービングの差異

jpa-2.0: OpenJPA では、エンティティーを拡張する必要があります。詳しくは、製品資料で JPA 2.0 用の JPA エンティティーの機能拡張を参照してください。

jpa-2.1: EclipseLink は、拡張されていないエンティティーで機能します。WebSphere Application Server では、静的機能拡張がサポートされます。

遅延ロードやいくつかのパフォーマンス向上など、一部のフィーチャーが使用できない場合があります。

  • jpa-2.0 (OpenJPA) プロバイダーで使用するためにエンティティー・クラスが静的に拡張された場合、jpa-2.1 プロバイダーを使用する前にクラスを再コンパイルする必要があります。
  • Libertyjpa-2.1 フィーチャーを使用するように構成されていて、 OpenJPA 拡張を使用してエンティティーが拡張される場合、以下のエラーがスローされます。
    java.lang.NoClassDefFoundError: 
    org.apache.openjpa.enhance.PersistenceCapable.
  • NoClassDefFoundError が発生する理由は、 Liberty サーバーが jpa-2.1 を使用するように構成されている場合は OpenJPA クラスが実行時にサーバーには使用可能でないためです。
    • この問題を解決するには、アプリケーションを再コンパイルし、OpenJPA エンハンサーを使用してエンティティーが拡張されないようにします。エンティティーをまったく拡張しないか、または、OpenJPA 拡張の代わりに EclipseLink 拡張を使用してエンティティーを拡張します。
    • あるいは、エンティティーを拡張状態のままにし、 jpa-2.0 フィーチャーを使用するように Liberty を再構成します。この場合、JPA 2.1 の一部の機能を使用できなくなります。
データ・ソース使用法の差異

jpa-2.0 フィーチャーは non-jta-datasource を控えめに使用するため、アプリケーションの調整時に non-jta-datasource 接続はほとんど必要ありません。

jpa-2.1 は、データの読み取り時に non-jta-datasource 接続を使用し、トランザクションはアクティブではありません。つまり、このフィーチャーを使用する際には、non-jta-datasource 接続プールを大きくする必要があります。

2 つの JPA プロバイダーのさらなる差異については、OpenJPA -> EclipseLink マイグレーション・ガイド・ページを参照してください。

OpenJPA で使用可能な JPA 2.1 フィーチャー

OpenJPA は、JPA 2.0 プロバイダーであり、新しい JPA 2.1 フィーチャーと同様に機能するフィーチャーを備えています。つまり、jpa-2.0 フィーチャーを使用している既存のアプリケーションがあり、JPA 2.1 フィーチャーの一部を使用する場合に、jpa-2.1 フィーチャーに切り替える必要はありません。切り替えずに、OpenJPA によって提供されている、新規フィーチャーに相当するフィーチャーを使用できます。OpenJPA で使用可能な主要な JPA 2.1 フィーチャーの一部を以下に示します。

スキーマの生成

このフィーチャーにより、DDL を生成したり、データベースと直接対話したりして、JPA エンティティー定義に基づいて表スキーマを定義できます。詳しくは、JPA 2.1 仕様のセクション 9.4 を参照してください。

OpenJPA の等価フィーチャー: スキーマ・マッパー

エンティティー・グラフ

このフィーチャーにより、エンティティー・オブジェクトのグラフのフェッチまたは処理を指定できます。詳しくは、JPA 2.1 仕様のセクション 3.7 を参照してください。

OpenJPA の等価フィーチャー: FetchPlan および FetchGroup

ストアード・プロシージャー照会

このフィーチャーにより、データベースに保管されたプロシージャーを起動できます。詳しくは、JPA 2.1 仕様のセクション 3.10.17 を参照してください。

OpenJPA の等価フィーチャー: 照会呼び出し

基本属性型変換

このフィーチャーにより、基本型属性について、属性エンティティー表現とデータベース表現の間で変換することができます。詳しくは、JPA 2.1 仕様のセクション 3.8 を参照してください。

OpenJPA の等価フィーチャー: Externalizer フィーチャー

@Index アノテーションおよび @ForeignKey アノテーション

JPA 2.1 仕様のセクション 11.1.19 および 11.1.23 を参照してください。

OpenJPA の等価フィーチャー: OpenJPA の @Index および @ForeignKey

EntityManager、Cache のアンラップ・ユーティリティー・メソッド

JPA 2.1 仕様のセクション 3.1.1 および 7.10 を参照してください。

OpenJPA の等価フィーチャー: EntityManagerImpl.unwrap()および OpenJPAPersistence.cast()

ネイティブ SQL からの結果のマップ時におけるオブジェクト作成

JPA 2.1 仕様のセクション 3.10.16.2.2 を参照してください。

OpenJPA の等価フィーチャー: ResultShape オブジェクト。


トピックのタイプを示すアイコン 概念トピック



タイム・スタンプ・アイコン 最終更新: Monday, 5 December 2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-libcore-mp&topic=cwlp_jpa21_behavior
ファイル名: cwlp_jpa21_behavior.html