8.4.1 エンティティの状態遷移
エンティティには状態があります。エンティティに対して操作するとエンティティの状態は遷移します。ここでは,エンティティの状態の種類,エンティティに対して実行する操作,およびエンティティの操作と状態遷移について説明します。
(1) エンティティの状態の種類
エンティティの状態には,new,managed,detached,removedの4種類があります。EntityManagerのメソッドを利用してエンティティを操作することで,エンティティの状態が変更されます。
エンティティのそれぞれの状態について次の表に示します。
エンティティインスタンスの状態 |
説明 |
---|---|
新しく生成された状態のエンティティです。 新しく生成されたエンティティインスタンスは,永続化アイデンティティを持ちません。このため,永続化コンテキストに関連づいていません。 |
|
永続化コンテキストに関連づけられた永続化アイデンティティを持ち,永続化コンテキストで管理されている状態です。 |
|
永続化コンテキストに関連づけられていない永続化アイデンティティを持つ状態です。 |
|
永続化アイデンティティを持ち,永続化コンテキストに関連づけられている状態です。また,エンティティインスタンスがデータベースから削除されることが予定されている状態でもあります。 |
(2) エンティティに対する操作
ユーザがデータベースのレコードを検索すると,CJPAプロバイダは取得したデータをエンティティのフィールドに保持します。また,ユーザがデータベースの内容を更新する場合は,永続化コンテキストに登録されているエンティティの状態を変更して,トランザクションをコミットすることでデータベースにエンティティの状態を反映します。このように,エンティティに対して操作することで,データベースの情報を更新します。
エンティティに対する操作の種類を次の表に示します。
操作 |
説明 |
---|---|
flush |
エンティティオブジェクトの内容をデータベースに反映します。 |
merge |
EntityManagerの管理対象外となっているエンティティオブジェクトをEntityManagerの管理対象とします。 |
persist |
エンティティオブジェクトを管理して,永続化します。 |
refresh |
エンティティオブジェクトにデータベースの内容を反映します。 |
remove |
エンティティオブジェクトを削除予定状態にします。 |
(3) エンティティに対する操作と状態遷移
エンティティインスタンスに対する操作と状態遷移について次の図で説明します。
エンティティに対する操作と状態遷移について次の表にまとめます。
操作 |
状態 |
|||
---|---|---|---|---|
new |
managed |
detached |
removed |
|
persist |
managed※1 |
managed |
managed※1 |
managed |
remove |
new |
removed |
例外※2,※3 |
Removed |
merge |
|
|
|
例外※3,※4 |
refresh |
例外※2,※4 |
managed※5 |
例外※2,※4 |
例外※2,※4 |
commit |
− |
※6 |
− |
detached |
rollback |
− |
detached |
− |
detached |
flush |
− |
managed |
− |
detached |
clear |
− |
detached |
− |
detached |
また,persist,remove,merge,refreshをトランザクション外で実行した場合の動作は,永続化コンテキストの種類によって異なります。
-
トランザクションスコープの永続化コンテキストの場合
TransactionRequiredExceptionとなります。
-
拡張された永続化コンテキストの場合
状態が遷移して,次のトランザクション決着のタイミングでデータベースに状態が反映されます。
(4) エンティティに対する操作の伝播
エンティティがリレーションシップを持つ場合に,リレーションシップを表すアノテーションのcascade属性を指定すると,エンティティに対する操作が関連するエンティティに対して伝播されます。cascade属性には,次の表に示す値を指定できます。
cascade属性の種類 |
説明 |
---|---|
CascadeType.ALL |
persist,remove,merge,refreshの操作が関連先に伝播されます。 |
CascadeType.PERSIST |
persist操作が関連先に伝播されます。 |
CascadeType.REMOVE |
remove操作が関連先に伝播されます。 |
CascadeType.MERGE |
merge操作が関連先に伝播されます。 |
CascadeType.REFRESH |
refresh操作が関連先に伝播されます。 |