EntityManager インターフェースは、エンティティー・インスタンスのライフサイクルを管理する API です。
エンティティーは、リレーショナル・データベース上で自身を持続できません。 注釈は、POJO をエンティティーとして宣言するため、またはリレーショナル・データベース上の 対応する表とのマッピングおよび関係を定義するためにのみ使用されます。
JPA では EntityManager インターフェースを使用して、アプリケーションがリレーショナル・データベース内にあるエンティティーを管理したり検索したりできるようにします。
EntityManager は、エンティティー・インスタンスのライフサイクルを 管理する API です。1 つの EntityManager オブジェクトが、1 つのパーシスタンス・ユニットによって定義された一連の エンティティーを管理します。各 EntityManager インスタンス は、1 つのパーシスタンス・コンテキスト と関連付けられます。パーシスタンス・コンテキストは、EntityManager によって使用可能にされる API を使用して特定のエンティティー・インスタンスが作成、保持、削除される際のスコープを定義します。 パーシスタンス・コンテキストは概念上いくぶんか、トランザクション・コンテキストと類似しているところがあります。
エンティティー・マネージャーは、加えられた変更と更新内容についてパーシスタンス・コンテキスト内のすべてのエンティティー・オブジェクト をトラッキングし、そうした変更内容 をデータベースにフラッシュします。パーシスタンス・コンテキストが閉じられると、すべての管理対象エンティティー・オブジェクト・インスタンスは、 パーシスタンス・コンテキストおよびそれに関連付けられたエンティティー・マネージャーから切り離され、 管理の対象でなくなくなります。 オブジェクトがパーシスタンス・コンテキストから切り離されると、エンティティー・マネージャーの管理対象からはずれるので、このオブジェクト・インスタンスに加えられる状態変更がデータベースと同期されることはなくなります。
エンティティー・オブジェクト・インスタンスは、 エンティティー・マネージャーによって管理される (接続) か、または非管理 (切り離し) かのいずれかです。
エンティティーがエンティティー・マネージャーに接続されると、マネージャーは、そのエンティティーへの変更をモニターし、エンティティー・マネージャーがその状態をフラッシュしようと決定したとき常に、 それらの変更をデータベースと同期化します。
エンティティーが切り離されると、つまりパーシスタンス・コンテキストと関連付けがなくなると、 エンティティーは非管理となり、その状態変更についてのエンティティー・マネージャーによるトラッキングは行われません。
トランザクション・スコープまたは拡張パーシスタンス・コンテキストが終了すると、 エンティティー・インスタンスは非管理となり、切り離されます。その結果として重要なのは、 切り離されたエンティティーは、シリアライズ、およびネットワークを使って リモート・クライアントに送信することが可能になるということです。 クライアントは、これらのシリアライズド・オブジェクト・インスタンスにリモート側で変更を加えて、 サーバーに送り返し、そこで再度マージし、データベースと同期をとることができます。
操作 | 説明 |
---|---|
persist |
|
find | 指定のパーシスタント ID (主キー) の管理対象エンティティー・インスタンスを取得し、見つからない場合は NULL を戻します。 |
remove | 指定のパーシスタント ID の管理対象エンティティーをデータベースから削除します。 |
merge | 切り離されたエンティティーの状態が、そのエンティティーの管理対象コピーにマージされるようにします。戻される 管理エンティティーは、切り離されたエンティティーとは別の Java ID を持ちます。 |
refresh | エンティティーの状態をデータベースから再ロードします。 |
lock | パーシスタンス・コンテキストに含まれるエンティティー・オブジェクトにロック・モードを設定します。 |
flush | データベースと強制的に同期を行います。 |
contains | 現在のパーシスタンス・コンテキストにエンティティーが含まれるかどうかを判別します。 |
createQuery | 動的 Java パーシスタント照会言語を使用して、照会インスタンスを作成します。 |
createNamedQuery | 定義済み照会のインスタンスを作成します。 |
createNativeQuery | SQL 照会のインスタンスを作成します。 |
Java EE 環境でエンティティー・マネージャーを使用する 1 つの方法は、コンテナー管理エンティティー・マネージャーによる方法です。 この方式では、エンティティー・マネージャーのオープンとクローズを、つまり、 パーシスタンス・コンテキストのライフサイクルを、コンテナーが (アプリケーションに認識されない方法で) 管理します。 また、コンテナー管理エンティティー・マネージャーは、トランザクション境界も管理します。
コンテナー管理エンティティー・マネージャーは、 アプリケーション内で依存関係注入または JNDI ルックアップによって取得され、 コンテナーは、エンティティー・マネージャー・ファクトリーとの相互作用を、アプリケーションには透過的な方法で 管理します。
コンテナー管理エンティティー・マネージャーでは、JTA トランザクションを使用する必要があります。パーシスタンス・コンテキストが自動的に現行 JTA トランザクションと共に伝搬され、同じパーシスタンス・ユニットにマップされるエンティティー・マネージャー参照が JTA トランザクション内の同一のパーシスタンス・コンテキストへのアクセスを提供するからです。 Java EE コンテナー によってパーシスタンス・コンテキストがこのように伝搬されるということは、 アプリケーションがエンティティー・マネージャー・インスタンスに対する参照をコンポーネント間で受け渡す必要がないことを意味します。
アプリケーション管理エンティティー・マネージャーを使用すると、アプリケーション・コードでエンティティー・マネージャーを制御することができます。