Java Persistence
API は、パーシスタンス・プログラミング・モデルを簡素化したものです。
データ・パーシスタンス、つまり一部の形式の不揮発性ストレージ (リレーショナル・データベースなど) のアプリケーション・セッション間でデータを維持する機能は、エンタープライズ・アプリケーションにとってはとても重要になります。この環境用に開発するアプリケーションでは、データ・パーシスタンス自体を管理するか、サード・パーティーのソリューションを使用してデータベース更新と検索を処理する必要があります。
JPA には、データ・パーシスタンスとオブジェクト関連マッピングを管理するメカニズムと、EJB 3.0 仕様の関数が備わっています。
JPA は Java EE 環境に適用される Java プログラミング・モデルに基づいていますが、同時に JPA は Java SE 環境でも作動します。JPA 仕様は、ベンダー固有のマッピング実装に依存するのではなく、オブジェクト関連マッピングを内部的に定義し、オブジェクトをデータベース表にマップするために注釈または XML を使用します。
JPA は、Java Enterprise
Edition (Java EE) コンテナーの内外で作動するように設計されています。JPA をコンテナー内で実行すると、アプリケーションはそのコンテナーを使用してパーシスタンスを管理できます。JPA を管理するコンテナーがない場合、アプリケーション自体でパーシスタンス管理を処理する必要があります。
コンテナー管理パーシスタンス用に設計されたアプリケーションの場合にはコンテナー外で使用することはできませんが、独自のパーシスタンスを管理するアプリケーションの場合にはコンテナー環境でも Java SE 環境でも作動します。
また JPA には照会言語 JPQL もあります。JPQL を使用すると、作業しているデータベースに固有の SQL 照会を作成しないでも、オブジェクトを検索できます。
JPA をサポートする Java EE コンテナーは、パーシスタンス・プロバイダーを指定しなければなりません。JPA パーシスタンス・プロバイダーは、EJB 3.0 環境でデータを保持するために以下のエレメントを使用します。
- エンティティー・オブジェクト: エンティティーは簡単な Java クラスで、データベース表にある行を表します。エンティティーは、具象クラスまたは抽象クラスとすることができます。エンティティーは、プロパティーやフィールドを使用して状態を維持します。
- EntityManager:
EntityManager オブジェクトは、アプリケーションが使用しているエンティティー・オブジェクトのアクティブなコレクションを保持します。EntityManager オブジェクトは、オブジェクト関連マッピングに関するデータベース対話とメタデータを処理します。
EntityManager オブジェクトのインスタンスは、パーシスタンス・コンテキストを表します。コンテナー内のアプリケーションが、アプリケーションへの注入、または Java コンポーネント名前空間におけるルックアップによって、EntityManager を取得できます。アプリケーション自体でパーシスタンスを管理する場合、EntityManager は EntityManagerFactory から取得します。通常は、アプリケーション・サーバー・コンテナーがこの機能を提供しますが、JPA アプリケーション管理パーシスタンスを使用している場合には EntityManagerFactory が必要となります。
注: EntityManager の注入がサポートされているのは、以下の成果物に関してのみです。
- EJB
3.0 セッション Bean。
- EJB 3.0 メッセージ駆動型 Bean。
- サーブレット。ただし、注入は JSP ではサポートされてません。
- アプリケーション・クライアントのメイン・クラス。
- EntityManagerFactory:
このファクトリーは、データベース対話用に EntityManager を作成するために使用されます。
- パーシスタンス・ユニット: パーシスタンス・ユニットは、リレーショナル・データベースに対するエンティティー・クラス・オブジェクトのリレーションシップについて記述した宣言メタデータによって構成されています。EntityManagerFactory はこのデータを使用して、EntityManager を介してアクセス可能なパーシスタンス・コンテキストを作成します。
- パーシスタンス・コンテキスト: パーシスタンス・コンテキストとは、アプリケーションが現在処理している一連のアクティブ・インスタンスです。
パーシスタンス・コンテキストは手動で作成することもできますし、注入によって作成することもできます。