エンティティー・マネージャー

EntityManager インターフェースは、エンティティー・インスタンスのライフサイクルを管理する API です。

エンティティーは、リレーショナル・データベース上で自身を持続できません。 注釈は、POJO をエンティティーとして宣言するため、またはリレーショナル・データベース上の 対応する表とのマッピングおよび関係を定義するためにのみ使用されます。

JPA では EntityManager インターフェースを使用して、アプリケーションがリレーショナル・データベース内にあるエンティティーを管理したり検索したりできるようにします。

EntityManager は、エンティティー・インスタンスのライフサイクルを 管理する API です。1 つの EntityManager オブジェクトが、1 つのパーシスタンス・ユニットによって定義された一連の エンティティーを管理します。各 EntityManager インスタンス は、1 つのパーシスタンス・コンテキスト と関連付けられます。パーシスタンス・コンテキストは、EntityManager によって使用可能にされる API を使用して特定のエンティティー・インスタンスが作成、保持、削除される際のスコープを定義します。 パーシスタンス・コンテキストは概念上いくぶんか、トランザクション・コンテキストと類似しているところがあります。

エンティティー・マネージャーは、加えられた変更と更新内容についてパーシスタンス・コンテキスト内のすべてのエンティティー・オブジェクト をトラッキングし、そうした変更内容 をデータベースにフラッシュします。パーシスタンス・コンテキストが閉じられると、すべての管理対象エンティティー・オブジェクト・インスタンスは、 パーシスタンス・コンテキストおよびそれに関連付けられたエンティティー・マネージャーから切り離され、 管理の対象でなくなくなります。 オブジェクトがパーシスタンス・コンテキストから切り離されると、エンティティー・マネージャーの管理対象からはずれるので、このオブジェクト・インスタンスに加えられる状態変更がデータベースと同期されることはなくなります。

管理対象エンティティーおよび非管理対象エンティティー

エンティティー・オブジェクト・インスタンスは、 エンティティー・マネージャーによって管理される (接続) か、または非管理 (切り離し) かのいずれかです。

エンティティーがエンティティー・マネージャーに接続されると、マネージャーは、そのエンティティーへの変更をモニターし、エンティティー・マネージャーがその状態をフラッシュしようと決定したとき常に、 それらの変更をデータベースと同期化します。

エンティティーが切り離されると、つまりパーシスタンス・コンテキストと関連付けがなくなると、 エンティティーは非管理となり、その状態変更についてのエンティティー・マネージャーによるトラッキングは行われません。

トランザクション・スコープまたは拡張パーシスタンス・コンテキストが終了すると、 エンティティー・インスタンスは非管理となり、切り離されます。その結果として重要なのは、 切り離されたエンティティーは、シリアライズ、およびネットワークを使って リモート・クライアントに送信することが可能になるということです。 クライアントは、これらのシリアライズド・オブジェクト・インスタンスにリモート側で変更を加えて、 サーバーに送り返し、そこで再度マージし、データベースと同期をとることができます。

注: この動作は EJB 2.1 エンティティー・モデルと異なります。2.1 では、 エンティティーは常にコンテナーによって管理されます。EJB 3.0 では、POJO であるエンティティーを処理するので、 Java™ EE アプリケーションの設計が簡略化されます。 これは、ビジネス・ロジック・レイヤー (セッション Bean) とパーシスタンス・レイヤー間で、 データ転送オブジェクト (DTO) などのパターンを使用することが強制されないためです。

エンティティー・マネージャーの操作

エンティティー・マネージャーが実行可能な主な操作を以下に示します。
表 1. エンティティー・マネージャーの操作. この表は、エンティティー・マネージャーの操作を示します。
操作 説明
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 コンテナー によってパーシスタンス・コンテキストがこのように伝搬されるということは、 アプリケーションがエンティティー・マネージャー・インスタンスに対する参照をコンポーネント間で受け渡す必要がないことを意味します。

コンテナー管理パーシスタンス・コンテキストは、以下の 2 つの異なるスコープのいずれかを持つように定義できます。
  • トランザクション・パーシスタンス・スコープ
  • 拡張パーシスタンス・スコープ

アプリケーション管理エンティティー・マネージャー

アプリケーション管理エンティティー・マネージャーを使用すると、アプリケーション・コードでエンティティー・マネージャーを制御することができます。

アプリケーション管理エンティティー・マネージャーを使用する場合には、以下の事柄に注意を払ってください。
  • アプリケーション管理エンティティー・マネージャーを使用する場合、 パーシスタンス・コンテキストはアプリケーション・コンポーネントに伝搬されず、 エンティティー・マネージャー・インスタンスのライフサイクルはアプリケーションによって管理されます。つまり、パーシスタンス・コンテキストは、特定のパーシスタンス・ユニットにあるエンティティー・マネージャー・インスタンス間で JTA トランザクションと共に伝搬されることはありません。
  • エンティティー・マネージャーと、それに関連付けられたパーシスタンス・コンテキストは、 アプリケーションによって明示的に作成および破棄されます。
このタイプのエンティティー・マネージャーは、以下のような 2 つの異なるシナリオで使用されます。
  • スタンドアロンのパーシスタンス・コンテキストにアクセスしたいが、そのコンテキストを指定のパーシスタンス・ユニットのエンティティー・マネージャー参照間で JTA トランザクションと共に伝搬したくない場合に、Java SE 環境で使用する。
  • エンティティー・マネージャーのライフサイクル全体に対する制御を微細化したい場合に Java EE コンテナー内部で使用する。
トピックのタイプを示すアイコン 概念のトピック
インフォメーション・センターのご利用条件 | フィードバック

タイム・スタンプ・アイコン 最終更新: May 29, 2014 10:20

ファイル名: c_entity_manager.html