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

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

エンティティー自体を、リレーショナル・データベースで保持することはできません。注釈を使用するのは、POJO をエンティティーとして宣言する場合、またはリレーショナル・データベース上の対応する表とのマッピングとリレーションシップを定義する場合だけです。

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

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

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

管理対象エンティティーと非管理対象エンティティー

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

エンティティーがエンティティー・マネージャーに接続されると、このマネージャーはそのエンティティーに対するすべての変更をモニターし、エンティティー・マネージャーがその状態をフラッシュするように判断するとデータベースとの同期が行われます。

エンティティーが切り離されると、パーシスタンス・コンテキストとの関連付けがなくなるので、管理対象外となり、状態変更をエンティティー・マネージャーはトラッキングしなくなります。

エンティティー・マネージャーによる操作

エンティティー・マネージャーが実行可能な主な操作を以下に示します。
表 1. エンティティー・マネージャーによる操作
操作 説明
保持
  • 新しいエンティティー・インスタンスをデータベースに挿入します。
  • エンティティーの保持状態と、保持しているリレーションシップ参照を保存します。
  • エンティティー・インスタンスが管理対象となります。
検索 指定のパーシスタント ID (主キー) の管理対象エンティティー・インスタンスを取得します。見つからない場合には、NULL が戻ります。
削除 指定のパーシスタント ID の管理対象エンティティーをデータベースから削除します。
マージ 切り離されたエンティティーの状態が、切り離されたエンティティーの管理対象コピーにマージされるようにします。戻される管理対象エンティティーの Java ID は、切り離されたエンティティーの ID とは異なります。
更新 エンティティーの状態をデータベースから再ロードします。
ロック パーシスタンス・コンテキストに含まれるエンティティー・オブジェクトにロック・モードを設定します。
フラッシュ データベースと強制的に同期を行います。
含む 現在のパーシスタンス・コンテキストにエンティティーが含まれるかどうかを判別します。
createQuery 動的 Java Persistent 照会言語を使用して照会インスタンスを作成します。
createNamedQuery 定義済み照会インスタンスを作成します。
createNativeQuery SQL 照会インスタンスを作成します。

コンテナー管理エンティティー・マネージャー

Java EE 環境でエンティティー・マネージャーを使用する 1 つの方法は、コンテナー管理エンティティー・マネージャーを使用する方法です。この方式の場合、コンテナーがエンティティー・マネージャーを開いたり閉じたりし、パーシスタンス・コンテキストのライフサイクルも (アプリケーションには透過的な方法で) 管理します。また、コンテナー管理エンティティー・マネージャーは、トランザクション境界も管理します。

コンテナー管理エンティティー・マネージャーは依存関係注入や JNDI ルックアップの際にアプリケーションで使用でき、コンテナーはアプリケーションには透過的な方法で、エンティティー・マネージャー・ファクトリーとの対話を管理します。

コンテナー管理エンティティー・マネージャーでは、JTA トランザクションを使用する必要があります。パーシスタンス・コンテキストは自動的に現在の JTA トランザクションに伝搬され、同じパーシスタンス・ユニットにマップされるエンティティー・マネージャー参照は、その JTA トランザクション内の同一のパーシスタンス・コンテキストにアクセスするからです。 Java EE コンテナーによってパーシスタンス・コンテキストがこのように伝搬されるということは、アプリケーションではコンポーネント間でエンティティー・マネージャー・インスタンスに対する参照を受け渡す必要がないということを意味します。

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

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

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

アプリケーション管理エンティティー・マネージャーを使用する場合には、以下の事柄に注意を払ってください。
  • アプリケーション管理エンティティー・マネージャーを使用する場合、パーシスタンス・コンテキストはアプリケーション・コンポーネントに伝搬されず、エンティティー・マネージャー・インスタンスのライフサイクルはアプリケーションが管理します。つまり、パーシスタンス・コンテキストは、特定のパーシスタンス・ユニットにあるエンティティー・マネージャー・インスタンスで JTA トランザクションに伝搬されることはありません。
  • エンティティー・マネージャーとその関連するパーシスタンス・コンテキストは、アプリケーションによって明示的に作成および破棄されます。
通常このタイプのエンティティー・マネージャーは、次の異なる 2 つのシナリオで使用されます。
  • Java SE 環境で、スタンドアロンのパーシスタンス・コンテキストにアクセスするものの、指定のパーシスタンス・ユニットのエンティティー・マネージャー参照でそのコンテキストを JTA トランザクションに伝搬しない場合。
  • Java EE コンテナーで、エンティティー・マネージャーのライフサイクルを詳細に制御する場合。

フィードバック