Cosminexus V9 アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)

[目次][用語][索引][前へ][次へ]

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[図データ]

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

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

操作 状態
new managed detached removed
persist managed※1 managed managed※1 managed
remove new removed 例外※2,※3 Removed
merge
  • コピー元
    new
  • コピー先
    managed

  • コピー元
    managed
  • コピー先
    managed

  • コピー元
    detached
  • コピー先
    managed
例外※3,※4
refresh 例外※2,※4 managed※5 例外※2,※4 例外※2,※4
commit ※6 detached
rollback detached detached
flush managed detached
clear detached detached

(凡例)−:該当しない

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

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

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

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

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

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


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

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

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

表6-7 cascade属性の種類

cascade属性の種類 説明
CascadeType.ALL persist,remove,merge,refreshの操作が関連先に伝播されます。
CascadeType.PERSIST persist操作が関連先に伝播されます。
CascadeType.REMOVE remove操作が関連先に伝播されます。
CascadeType.MERGE merge操作が関連先に伝播されます。
CascadeType.REFRESH refresh操作が関連先に伝播されます。