6.4.1 エンティティの状態遷移

エンティティには状態があります。エンティティに対して操作するとエンティティの状態は遷移します。ここでは,エンティティの状態の種類,エンティティに対して実行する操作,およびエンティティの操作と状態遷移について説明します。

<この項の構成>
(1) エンティティの状態の種類
(2) エンティティに対する操作
(3) エンティティに対する操作と状態遷移
(4) エンティティに対する操作の伝播

(1) エンティティの状態の種類

エンティティの状態には,new,managed,detached,removedの4種類があります。EntityManagerのメソッドを利用してエンティティを操作することで,エンティティの状態が変更されます。

エンティティのそれぞれの状態について次の表に示します。

表6-4 エンティティの状態

エンティティインスタンスの状態説明
new新しく生成された状態のエンティティです。
新しく生成されたエンティティインスタンスは,永続化アイデンティティを持ちません。このため,永続化コンテキストに関連づいていません。
managed永続化コンテキストに関連づけられた永続化アイデンティティを持ち,永続化コンテキストで管理されている状態です。
detached永続化コンテキストに関連づけられていない永続化アイデンティティを持つ状態です。
removed永続化アイデンティティを持ち,永続化コンテキストに関連づけられている状態です。また,エンティティインスタンスがデータベースから削除されることが予定されている状態でもあります。

(2) エンティティに対する操作

ユーザがデータベースのレコードを検索すると,Cosminexus JPAプロバイダは取得したデータをエンティティのフィールドに保持します。また,ユーザがデータベースの内容を更新する場合は,永続化コンテキストに登録されているエンティティの状態を変更して,トランザクションをコミットすることでデータベースにエンティティの状態を反映します。このように,エンティティに対して操作することで,データベースの情報を更新します。

エンティティに対する操作の種類を次の表に示します。

表6-5 エンティティに対する操作の種類

操作説明
flushエンティティオブジェクトの内容をデータベースに反映します。
mergeEntityManagerの管理対象外となっているエンティティオブジェクトをEntityManagerの管理対象とします。
persistエンティティオブジェクトを管理して,永続化します。
refreshエンティティオブジェクトにデータベースの内容を反映します。
removeエンティティオブジェクトを削除予定状態にします。

(3) エンティティに対する操作と状態遷移

エンティティインスタンスに対する操作と状態遷移について次の図で説明します。

図6-3 エンティティインスタンスに対する操作と状態遷移

[図データ]

エンティティに対する操作と状態遷移について次の表にまとめます。

表6-6 エンティティの状態遷移

操作状態
newmanageddetachedremoved
persistmanaged※1managedmanaged※1managed
removenewremoved例外※2,※3Removed
merge
  • コピー元
    new
  • コピー先
    managed
  • コピー元
    managed
  • コピー先
    managed
  • コピー元
    detached
  • コピー先
    managed
例外※3,※4
refresh例外※2,※4managed※5例外※2,※4例外※2,※4
commit※6detached
rollbackdetacheddetached
flushmanageddetached
cleardetacheddetached

(凡例)-:該当しない

注※1 persist操作で例外が発生した場合,状態は遷移しないで元の状態になります。

注※2 発生する例外はIllegalArgumentExceptionです。

注※3 データベース上に対応する行が存在しない場合,操作は無視されます。

注※4 例外時には状態は遷移しないで,元のままとなります。

注※5 データベース上に対応する行が存在しない場合,EntityNotFoundExceptionが発生します。

注※6 トランザクションスコープの永続化コンテキストの場合はdetachedになります。拡張された永続化コンテキストの場合はmanagedになります。


また,persist,remove,merge,refreshをトランザクション外で実行した場合の動作は,永続化コンテキストの種類によって異なります。

(4) エンティティに対する操作の伝播

エンティティがリレーションシップを持つ場合に,リレーションシップを表すアノテーションのcascade属性を指定すると,エンティティに対する操作が関連するエンティティに対して伝播されます。cascade属性には,次の表に示す値を指定できます。

表6-7 cascade属性の種類

cascade属性の種類説明
CascadeType.ALLpersist,remove,merge,refreshの操作が関連先に伝播されます。
CascadeType.PERSISTpersist操作が関連先に伝播されます。
CascadeType.REMOVEremove操作が関連先に伝播されます。
CascadeType.MERGEmerge操作が関連先に伝播されます。
CascadeType.REFRESHrefresh操作が関連先に伝播されます。