8.12.4 アクセサメソッドの作成
ここでは,アクセサメソッドのシグネチャ規則,およびアクセサメソッドへのビジネスロジックの追加について説明します。
(1) アクセサメソッドのメソッドシグネチャ規則
CJPAプロバイダが永続化プロパティに対してアクセスする場合,プロパティのアクセサメソッドは,次に示すJavaBeansと同じメソッドシグネチャ規則に従っている必要があります。
-
T getProperty()
-
void setProperty(T t)
booleanの戻り値を返すプロパティの場合,getterメソッドはisPropertyという名前にすることもできます。なお,CJPAプロバイダを使用する場合,getterメソッドとsetterメソッドのどちらかしかないときには,アプリケーション開始時に例外が発生します。
また,永続化フィールド,永続化プロパティでコレクション値を扱う場合は,次に示すコレクション値をインタフェースで定義してください。
-
java.util.Collection
-
java.util.Set
-
java.util.List
-
java.util.Map
永続化プロパティがコレクション値となる場合,アクセサメソッドのメソッドシグネチャはこれらのインタフェースのどれかにしてください。または,これらのコレクションのジェネリックな型を使用することもできます(例:Set<T>)。
(2) アクセサメソッドへのビジネスロジックの追加
アクセサメソッドは,プロパティのsetter/getter処理に加えて,値を検証するなどのビジネスロジックを含むことができます。アクセスタイプがプロパティの場合,CJPAプロバイダがアクセサメソッドを呼び出すタイミングでビジネスロジックが動作します。
ただし,この場合には,次の点に注意してください。
-
CJPAプロバイダの実行時に,永続状態をロードして格納するアクセサメソッドが呼び出される順番は定義されていません。このため,getterに含まれるロジックの実行順序は未定となります。
-
アクセスタイプがプロパティで,永続化プロパティでlazyフェッチが指定されている場合で,移植性を求めるには,エンティティの内容がCJPAプロバイダにフェッチされるまで,エンティティの内容にアクセスしないことをお勧めします。
-
アクセスタイプがプロパティの場合で,ビジネスロジックとして値を変更するロジックを追加したときには,CJPAプロバイダではデータの一貫性は保証しません。
プロパティアクセサメソッドでRuntime例外が発生すると,現在のトランザクションはロールバックにマークされます。CJPAプロバイダがエンティティの永続状態の内容を読み込んだり,格納する際のアクセサメソッドで例外が発生したりした場合,トランザクションはロールバックされます。また,アプリケーション例外をラップするPersistenceException例外が発生します。