3.9. 永続コンテキストのフラッシュ


3.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
Copy to Clipboard Toggle word wrap
フラッシュ中に、例外が発生することがあります (例:DML 操作が制約を違反した場合)。
Hibernate は EJB3 仕様で説明されたものよりも多くのフラッシュモードを提供します。詳細については、Hibernate Core リファレンスドキュメンテーションを参照してください。
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2026 Red Hat
トップに戻る