Perbedaan antara save dan saveAndFlush in Spring data jpa

131

Saya mencoba mempelajari data musim semi JPA dengan menguji beberapa operasi CRUD via JpaRepository.

Saya menemukan dua metode savedan saveAndFlush. Saya tidak mendapatkan perbedaan antara keduanya. Saat menelepon savejuga perubahan saya diselamatkan ke dalam basis data jadi apa gunanya saveAndFlush.

Anand
sumber

Jawaban:

139

Aktif saveAndFlush, perubahan akan segera dialihkan ke DB dalam perintah ini. Dengan save, ini belum tentu benar, dan mungkin hanya tinggal di memori, sampai flushatau commitperintah dikeluarkan.

Tetapi perlu diketahui, bahwa bahkan jika Anda menyiram perubahan dalam transaksi dan tidak melakukan itu, perubahan tetap tidak akan terlihat oleh transaksi luar sampai komit dalam transaksi ini.

Dalam kasus Anda, Anda mungkin menggunakan semacam mekanisme transaksi, yang mengeluarkan commitperintah untuk Anda jika semuanya berjalan dengan baik.

pengguna1918305
sumber
35
"tidak akan terlihat oleh transaksi luar sampai komit dalam transaksi ini" Itu tergantung pada tingkat isolasi dari transaksi lainnya. Jika tingkat isolasi transaksi READ_UNCOMMITTED , maka ia akan melihat apa yang telah memerah tetapi belum dilakukan oleh transaksi lain.
Gab 是 好人
1
tetapi, dalam proyek saya, saya menggunakan save (), saveAll () & itu tetap di DB tanpa melakukan atau flush calling secara eksplisit. Lalu mengapa saya harus memilih saveAndFlush? Mode FLush semua hal itu dalam mode default
P Satish Patro
37

Bergantung pada mode siram hibernasi yang Anda gunakan ( AUTOadalah default) savemungkin atau mungkin tidak langsung menulis perubahan Anda ke DB. Saat Anda menelepon, saveAndFlushAnda sedang memaksakan sinkronisasi kondisi model Anda dengan DB.

Jika Anda menggunakan mode flush AUTO dan Anda menggunakan aplikasi Anda untuk menyimpan terlebih dahulu dan kemudian memilih data lagi, Anda tidak akan melihat perbedaan dalam bahvior antara save()dan saveAndFlush()karena pilih memicu flush pertama. Lihat dokumentasinya .

Ralf
sumber
maaf tetapi jika saya savesuatu entitas dan lagi yang sama, maksud Anda dengan saveperintah kedua tidak akan memberikan pengecualian untuk duplikasi misalnya ??
azerafati
3
@Bludream Ya, ini adalah pemahaman saya bahwa panggilan ke saveidempoten. Lihat utas ini untuk lebih jelasnya.
Ralf