Red Hat Training

A Red Hat training course is available for Red Hat JBoss Web Server

11.10. セッションのフラッシュ

JDBC コネクションの状態とメモリ上のオブジェクトの状態を同期させるために必要な SQL 文を Session が実行することがときどきあります。flush と言われるこの処理は、デフォルトでは次のときに起こります。
  • クエリを実行する前
  • org.hibernate.Transaction.commit() を実行したとき
  • Session.flush() を実行したとき
SQL 文は以下の順番で発行されます:
  1. Session.save() を使って該当のオブジェクトを保存したときと同じ順番ですべてのエンティティを挿入。
  2. すべてのエンティティの更新
  3. すべてのコレクションの削除
  4. すべてのコレクションの要素に対する削除、更新、挿入
  5. すべてのコレクションの挿入
  6. Session.delete() を使って該当のオブジェクトを削除したときと同じ順番ですべてのエンティティを削除。
例外として、native ID 生成を使ったオブジェクトは、それらが保存されたときに挿入されます。
明示的に flush() するときを除いて、いつ Session が JDBC をコールするかについて絶対的な保証はありません。ただし、それらが実行される 順番 だけは保証されます。しかし Hibernate は、Query.list(..) が古いデータや間違ったデータを返さないことを保証しています。
フラッシュが頻繁に起こらないようにデフォルトの振る舞いを変えることができます。FlushMode クラスは3つの異なるモードを定義します。それは、Hibernate の Transaction API が使われるコミット時にだけフラッシュするモード、説明のあった処理順に基づいて自動でフラッシュするモード、 flush() が明示的に呼ばれない限りフラッシュしないモードの3つです。最後のモードは、作業単位が長期間に及ぶ場合に役に立ちます ( 「拡張セッションと自動バージョニング」 を参照してください)。
sess = sf.openSession();
Transaction tx = sess.beginTransaction();
sess.setFlushMode(FlushMode.COMMIT); // allow queries to return stale state

Cat izi = (Cat) sess.load(Cat.class, id);
izi.setName(iznizi);

// might return stale data
sess.createQuery("from Cat as cat left outer join cat.kittens kitten");

// change to izi is not flushed!
...
tx.commit(); // flush occurs
sess.close();
フラッシュ時に例外が発生するかもしれません(例えば、DML 操作が制約を違反するような場合です)。例外処理を理解するためには、Hibernate のトランザクションの動作を理解する必要があるため、12章トランザクションと並行性で説明します。