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