Red Hat Training
A Red Hat training course is available for Red Hat JBoss Web Server
4.9. 永続コンテキストのフラッシュ
4.9.1. トランザクション内
場合によっては、エンティティマネージャはメモリに保持されたオブジェクトのステータスでデータストアを同期するのに必要な SQL DML ステートメントを実行します。このプロセスであるフラッシュは以下の時点でデフォルトで実行されます (これは Hibernate 固有であり、仕様では定義されません)。
- クエリ実行前*
javax.persistence.EntityTransaction.commit()*
からEntityManager.flush()
が呼び出されたとき
(*) トランザクションがアクティブな場合
SQL ステートメントは以下の順で発行されます。
- すべてのエンティティ挿入 (
EntityManager.persist()
を使用して対応するオブジェクトが保存されたのと同じ順序) - すべてのエンティティ更新
- すべてのコレクション削除
- すべてのコレクションエレメント削除、更新、および挿入
- すべてのコレクション挿入
- すべてのエンティティ削除 (
EntityManager.remove()
を使用して対応するオブジェクトが削除されたのと同じ順序)
(例外: アプリケーションにより割り当てられた ID を使用するエンティティインスタンスが保存時に挿入されます)
flush()
を明示的に使用する場合を除き、エンティティマネージャが JDBC コールを実行するタイミングに関して絶対的な保証はありません。実行順序のみ保証されます。ただし、Hibernate は Query.getResultList()
/Query.getSingleResult()
が無効なデータを返さず、アクティブなトランザクションで実行された場合に間違ったデータを返さないことを保証します。
フラッシュの頻度が少なくなるようにデフォルトの動作を変更できます。エンティティマネージャの
FlushModeType
は 2 つの異なるモードを定義します (コミット時のフラッシュまたは flush()
を明示的に呼び出さない場合の説明されたルーチンを使用した自動フラッシュ)。
em = emf.createEntityManager(); em.getTransaction().begin(); em.setFlushMode(FlushModeType.COMMIT); // allow queries to return stale state Cat izi = em.find(Cat.class, id); izi.setName(iznizi); // might return stale data em.createQuery("from Cat as cat left outer join cat.kittens kitten").getResultList(); // change to izi is not flushed! ... em.getTransaction().commit(); // flush occurs
フラッシュ中に、例外が発生することがあります (例:DML 操作が制約を違反した場合)。
Hibernate は JPA 仕様で説明されたものよりも多くのフラッシュモードを提供します。詳細については、Hibernate Core リファレンスドキュメンテーションを参照してください。