8.10.2 楽観的ロックに失敗した場合の例外処理
明示的に楽観的ロックの実行を確認したい場合は,flush()メソッドを呼び出します。flush()メソッドの呼び出しで楽観的ロック例外が発生した場合,例外処理をキャッチしてリカバリ処理を行うことができます。楽観的ロックに問題がない場合,flush()メソッドによってエンティティのバージョンのチェックおよびVersion列が更新されます。
例外処理の記述例を次に示します。
try{ em.flush(); } catch (OptimisticLockException e){ // 例外処理 }
この例に示すように,例外処理の中でOptimisticLockExceptionをラップすることで楽観的ロックの例外をアプリケーション例外として見せることができます。ただし,この場合のトランザクションはロールバックにマークされているので,コミットできないことに注意してください。
なお,CJPAプロバイダでは,例外の原因となったエンティティをOptimisticLockExceptionに格納しません。OptimisticLockExceptionのgetEntity()メソッドは常にnull値を返します。