Saya sedang mengumpulkan informasi tentang metode flush (), tetapi saya tidak begitu jelas kapan harus menggunakannya dan bagaimana menggunakannya dengan benar. Dari apa yang saya baca, pemahaman saya adalah bahwa konten konteks ketekunan akan disinkronkan dengan database, yaitu mengeluarkan pernyataan yang luar biasa atau menyegarkan data entitas.
Sekarang saya mendapat skenario berikut dengan dua entitas A
dan B
(dalam hubungan satu-ke-satu, tetapi tidak diberlakukan atau dimodelkan oleh JPA). A
memiliki PK gabungan, yang disetel secara manual, dan juga memiliki bidang IDENTITAS yang dibuat secara otomatis recordId
. Ini recordId
harus ditulis ke entitas B
sebagai kunci asing ke A
. Saya menabung A
dan B
dalam satu transaksi. Masalahnya adalah bahwa nilai yang dihasilkan otomatis A.recordId
tidak tersedia dalam transaksi, kecuali saya membuat panggilan eksplisit em.flush()
setelah menelepon em.persist()
di A
. (Jika saya memiliki IDENTITAS PK yang dibuat secara otomatis, maka nilainya langsung diperbarui di entitas, tetapi tidak demikian di sini.)
Apakah bisa em.flush()
menyebabkan kerugian saat menggunakannya dalam transaksi?
sumber
Sebenarnya,
em.flush()
melakukan lebih dari sekedar mengirim perintah SQL yang di-cache. Ia mencoba untuk menyinkronkan konteks ketekunan ke database yang mendasarinya. Ini dapat menyebabkan banyak konsumsi waktu pada proses Anda jika cache Anda berisi koleksi untuk disinkronkan.Perhatian saat menggunakannya.
sumber
Ya, itu mungkin menahan kunci dalam database untuk durasi yang lebih lama dari yang diperlukan.
Umumnya, Saat menggunakan JPA, Anda mendelegasikan manajemen transaksi ke container (alias CMT - menggunakan anotasi @Transactional pada metode bisnis) yang berarti bahwa transaksi secara otomatis dimulai saat memasuki metode dan berkomitmen / dibatalkan di bagian akhir. Jika Anda membiarkan EntityManager menangani sinkronisasi database, eksekusi pernyataan sql hanya akan dipicu sebelum komit, yang mengarah ke penguncian singkat dalam database. Jika tidak, operasi tulis yang dibilas secara manual dapat mempertahankan kunci antara pembilasan manual dan pengaktifan otomatis yang dapat berlangsung lama sesuai dengan waktu eksekusi metode yang tersisa.
Perhatikan bahwa beberapa operasi secara otomatis memicu pembilasan: menjalankan kueri asli pada sesi yang sama (status EM harus di-flush agar dapat dijangkau oleh kueri SQL), memasukkan entitas menggunakan id yang dihasilkan asli (dihasilkan oleh database, jadi pernyataan sisipkan harus dipicu sehingga EM dapat mengambil id yang dihasilkan dan mengelola hubungan dengan benar)
sumber