SpringデータJPAのsaveとsaveAndFlushの違い


131

を介してCRUD操作をテストすることにより、Spring Data JPAを学習しようとしていJpaRepositoryます。

私は2つの方法に出くわしたsavesaveAndFlush。これら2つの違いはわかりません。呼び出すsaveと、私の変更はデータベースに保存されるので、の用途は何ですかsaveAndFlush

回答:


139

saveAndFlush、変更は、このコマンドですぐにDBにフラッシュされます。ではsave、これは必ずしも当てはまりません。flushまたはcommitコマンドが発行されるまで、メモリ内にとどまることがあります。

ただし、トランザクションの変更をフラッシュしてコミットしない場合でも、このトランザクションでコミットするまで、変更は外部のトランザクションに表示されないことに注意してください。

あなたのケースでは、おそらく何らかのトランザクションメカニズムを使用commitしていますが、すべてがうまくいくとコマンドが発行されます。


35
「このトランザクションでコミットするまで、外部トランザクションからは見えません」 他のトランザクションの分離レベルによって異なります。トランザクションの分離レベルがREAD_UNCOMMITTEDの場合、フラッシュされたものの、他のトランザクションによってまだコミットされていないものが表示されます。
Gab是好人

1
しかし、私のプロジェクトでは、save()、saveAll()を使用しており、コミットまたはフラッシュの呼び出しを明示的に行わなくてもDBに保持されます。では、なぜsaveAndFlushを選ぶべきなのでしょうか。FLushモードこれらすべてのものはデフォルトモードにあります
P Satish

37

使用している休止状態フラッシュモード(AUTOデフォルト)にsave応じて、変更をすぐにDBに書き込む場合と書き込まない場合があります。呼び出すsaveAndFlushと、モデルの状態とDBの同期が強制されます。

フラッシュモードAUTOを使用し、アプリケーションを使用して最初に保存してから再度データを選択する場合、selectが最初にフラッシュをトリガーするため、save()との動作に違いはありませんsaveAndFlush()ドキュメントを参照してください。


申し訳ありませんが、私saveがエンティティと同じものである場合save、たとえば、2番目のコマンドで複製の例外がスローされないということですか?
azerafati 14

3
@Bludreamはい、呼び出しはべきsave等であることは私の理解です。詳細については、このスレッドを参照してください。
Ralf、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.