[解決済み] JPA/Hibernateにおけるflush()の正しい使い方
質問
flush()メソッドについて情報を集めていたのですが、いつ使うのか、どのように使うのが正しいのか、よくわかりません。私が読んだものから、私の理解は、永続性コンテキストの内容がデータベースと同期されること、すなわち未処理のステートメントの発行またはエンティティデータのリフレッシュです。
今、私は2つのエンティティで次のシナリオを得ました。
A
と
B
(1対1の関係ですが、JPAでは強制もモデル化もされていません)。
A
は複合PKを持ち、これは手動で設定され、また自動生成されたIDENTITYフィールドを持ちます
recordId
. これは
recordId
は、エンティティ
B
を外部キーとして
A
. 保存している
A
と
B
を1つのトランザクションで実行します。問題は、自動生成された値である
A.recordId
を明示的に呼び出さない限り、トランザクション内で利用できないことです。
em.flush()
を呼び出した後に
em.persist()
で
A
. (自動生成されたIDENTITY PKがあれば、その値は直接エンティティで更新されますが、ここではそうではありません)。
できます。
em.flush()
は、トランザクション内で使用する際に何か害を及ぼしますか?
どのように解決するのですか?
おそらく、正確には
em.flush()
の詳細については、実装に依存します。
一般に、HibernateのようなJPAプロバイダは、実際にトランザクションをコミットするまで、データベースに送信するはずのSQL命令をキャッシュすることができます。
たとえば
em.persist()
を呼び出すと、HibernateはデータベースへのINSERTを行う必要があることを記憶しますが、トランザクションをコミットするまでその命令は実際に実行されません。これは主にパフォーマンス上の理由から行われているようです。
一般的には、自動生成されたキーやデータベーストリガーのような、何らかの副作用の結果が必要なときです。
何
em.flush()
が行うのは、内部の SQL 命令キャッシュを空にし、データベースに対して即座に実行することです。
結論: 害はありませんが、データベースにSQL命令を送信する最適なタイミングに関してJPAプロバイダの決定を上書きしているため、(わずかな)パフォーマンスヒットが発生する可能性があります。
関連
-
[解決済み] Spring Data JPAにおけるCrudRepositoryとJpaRepositoryのインターフェースの違いは何ですか?
-
Java:未解決コンパイル問題の解決方法
-
Java の double データ型における 0.0 と -0.0 の問題
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] JPA EntityManager。なぜmerge()ではなくpersist()を使うのか?
-
[解決済み] Hibernateの「オブジェクトは保存されていないトランジェントインスタンスを参照しています - フラッシュする前にトランジェントインスタンスを保存してください」エラーの修正方法
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】JPA JoinColumnとmappedByの比較
-
[解決済み] Hibernate JPA シーケンス(非Id)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
NullPointerException - java.lang.
-
Git Pull Failed マージされていないファイルがあるため、Pull できません。
-
ajax コミット リソースの読み込みに失敗しました: サーバーはステータス 400 で応答しました ()
-
keytool error: java.io.FileNotFoundException: cacerts (アクセス拒否されました。)
-
Javaがテキストファイルを読み込む
-
API の戻り値を処理するために ResponseEntity を使用する
-
git pull appears現在のブランチに対するトラッキング情報がありません。
-
春ブート複数のデータソースの管理(atomikos)同じサーバーホスト上の複数のプロジェクトを開始する複数のJava - jarのエラーソリューション
-
Java基礎 - マッピングとQ/A
-
htmlとwordの相互変換の実装(画像あり)