Java Persistence API (JPA)
データ・パーシスタンスは、アプリケーションが不揮発性ストレージ・システムに情報を永続化してそこからその情報を取得する手段です。 Java™ Persistence API (JPA) は、EJB 3.0 仕様以降、パーシスタンスおよびオブジェクト関連のマッピングと機能を管理するためのメカニズムを提供します。
Libertyでの JPA 2.1 以降の使用については、 Open Liberty Web サイトを参照してください。
エンタープライズ・アプリケーションでは、リレーショナル・データベースにアクセスする必要があるため、パーシスタンスがきわめて重要です。 この環境用に開発されたアプリケーションは、パーシスタンス自身を管理するか、またはサード・パーティーのソリューションを使用して、パーシスタンスによるデータベースの更新および取り出しを処理する必要があります。
JPA 仕様は、ベンダー固有のマッピング実装に依存するのではなく、オブジェクト関連マッピングを内部的に定義します。 JPA は、Java Enterprise Edition (Java EE) 環境に適用される Java プログラミング・モデルに基づいていますが、JPA はアプリケーション機能をテストするために Java SE 環境内で機能することができます。
JPA は、パーシスタンス・プログラミング・モデルを単純化したものです。 JPA 仕様は、ベンダー固有のマッピング実装に依存するのではなく、オブジェクト関連マッピングを明示的に定義します。 JPA は、アノテーションまたは XML を使用してオブジェクトを 1 つのデータベースの 1 つ以上の表にマップすることで、オブジェクト関連マッピングという重要なタスクを標準化します。 パーシスタンス・プログラミング・ モデルをさらに単純化するには、以下のようにします。
- EntityManager API は、データベースのオブジェクトを永続化、更新、取得、または削除できます。
- パーシスタンスを維持するためにJDBC や SQL コードを記述する必要なしに、EntityManager API およびオブジェクト関連マッピング・メタデータによって、データベース操作の大部分が処理されます。
- JPA は、独立した EJB 照会言語 (JPQL とも呼ばれる) を拡張する照会言語を提供します。この照会言語を使用して、処理しているデータベースに固有の SQL 照会を記述することなく、オブジェクトを取得できます。
JPA は、Java Enterprise Edition (Java EE) コンテナーの内部と外部の両方で動作するように設計されています。 コンテナーの内側で JPA を実行した場合、アプリケーションはコンテナーを使用して、パーシスタンス・コンテキストを管理できます。 JPA を管理するコンテナーが存在しない場合、アプリケーション自体でパーシスタンス・コンテキスト管理を処理する必要があります。 コンテナー管理パーシスタンス用に設計されたアプリケーションは、パーシスタンスを処理するためにコード実装をそれほど必要としませんが、そうしたアプリケーションをコンテナーの外側で使用することはできません。 独自のパーシスタンスを管理するアプリケーションは、コンテナー環境または Java SE 環境で機能することができます。
EJB 3.x プログラミング・モデルをサポートする Java EE コンテナーは、パーシスタンス・プロバイダーとも呼ばれる JPA 実装をサポートする必要があります。 JPA パーシスタンス・プロバイダーは、以下のエレメントを使用して、EJB 3.x 環境におけるより容易なパーシスタンス管理を使用可能にします。
- パーシスタンス・ユニット
- リレーショナル・データベースを使用して、Java クラス (エンティティー + サポート構造) をマッピングする完全なオブジェクト・リレーショナル・モデルを定義します。 EntityManagerFactory はこのデータを使用して、EntityManager を通してアクセスできるパーシスタンス・コンテキストを作成します。
- EntityManagerFactory
- データベース対話用の EntityManager を作成するために使用されます。 一般的にアプリケーション・サーバー・コンテナーでこの機能を提供しますが、JPA アプリケーション管理パーシスタンスを使用している場合は、EntityManagerFactory は必須です。 EntityManagerFactory のインスタンスは、パーシスタンス・コンテキストを表します。
- パーシスタンス・コンテキスト
- アプリケーションが現在取り扱っているアクティブ・インスタンスのセットを定義します。 手動で、または注入を使用してパーシスタンス・コンテキストを作成することができます。
- EntityManager
- アプリケーションによって使用されているエンティティー・オブジェクトのアクティブ・コレクションを維持するリソース・マネージャー。 EntityManager は、 データベース対話およびオブジェクト関連マッピングのメタデータを処理します。 EntityManager のインスタンスは、パーシスタンス・コンテキストを表します。 コンテナー内のアプリケーションは、アプリケーションへの注入または Java コンポーネント名前空間での検索により、 EntityManager を取得することができます。 アプリケーションがパーシスタンスを管理している場合、 EntityManager は EntityManagerFactory から取得されます。
- エンティティー・オブジェクト
- データベース表の中の行を最も単純な形式で表す単純な Java クラス。 エンティティー・オブジェクトは、具象クラスであっても、抽象クラスであってもかまいません。 プロパティーまたはフィールドを使用して、状態が維持されます。
Java Persistence API とローカル・トランザクション・コンテキスト
WebSphere は、グローバル・トランザクション・コンテキストとローカル・トランザクション・コンテキストの両方を管理対象コンポーネントに提供します。 管理対象コンポーネントにこれらのコンテキストを提供し、スレッドを使用して管理対象コンポーネントにサービスを提供することにより、トランザクションは、グローバル・トランザクション・コンテキスト (GTC) またはローカル・トランザクション・コンテキスト (LTC) のどちらに対しても常にアクティブになります。
この処理は、アプリケーション管理パーシスタンス・コンテキスト、すなわち @PersistenceUnit を使用してアプリケーションに注入される EntityManagerFactory を介して獲得される JPA EntityManager には影響を与えません。 ただし、コンテナー管理パーシスタンス・コンテキスト (CMTS)、すなわち @PersistenceContext を使用して注入される JPA EntityManager には、この処理が影響する場合があります。 JPA API メソッドは、GTC の境界の外部で呼び出された場合、TransactionRequiredException がスローされることを必要とし、この例外は予期どおりにスローされます。 しかし、LTC がアクティブであり続ける間は、新しい GTC が開始されるか、またはコンポーネント・サービスの呼び出しの終わりに達するまで、CMTS パーシスタンス・コンテキストはアクティブのままになります。 LTC の境界内で CMTS EntityManager による検索または照会のいずれかを使用してフェッチされたエンティティーは、即座に切り離されず、そのパーシスタンス・コンテキストによって引き続き管理されます。 これは、一見、予期せぬ動作のようであり、一部の JPA プログラミング・ガイドにある動作とは異なるように見えるかもしれませんが、この処理の結果、LTC によって存続が維持されたパーシスタンス・コンテキストは、GTC が開始されると廃棄され、そのパーシスタンス・コンテキストによって管理されているエンティティーは切り離されます。