Mengenai masalah hibernate yang ditemui rekan-rekan saya kemarin. Ini adalah hal paling mendasar dari hibernasi. Saya memahami bahwa banyak orang yang mengalami masalah ini dan ini sangat umum terjadi, namun mereka sering kali bingung saat menghadapinya.
Untuk memperdalam kesannya, ketahuilah apa itu dan mengapa demikian.
Setelah itu, saya cukup menggunakan kerangka Hibernate asli untuk melakukan verifikasi, dan membuka konsol cetakan eksekusi SQL, dan sampai pada kesimpulan:
Premisnya adalah di tengah transaksi yang sama:
1. Gunakan pernyataan sql, session.createSQLQuery(sql).executeUpdate(); untuk menyisipkan, dan stasiun keluaran akan mencetak pernyataan penyisipan sql; kemudian gunakan pernyataan sql untuk melakukan session.createSQLQuery(sql).uniqueResult() ; dan query SQL juga akan dicetak, tidak ada masalah dan data dapat ditanyakan.
2. Gunakan hibernasi untuk merangkum operasi dan gunakan session.save(entity); Konsol keluaran tidak mencetak pernyataan SQL yang dimasukkan. Kemudian gunakan metode session.get(entity,id); itu juga tidak mencetak pernyataan kueri SQL, tetapi datanya dapat ditanyakan. Ketika pernyataan komit transaksi dijalankan, pernyataan SQL yang dimasukkan akan dicetak
3. Gunakan session.save(entity); hibernate untuk menyisipkan, lalu gunakan pernyataan "HQL" untuk melakukan kueri.
4. Gunakan session.save(entity); hibernate untuk menyisipkan, tetapi konsol keluaran tidak mencetak pernyataan SQL yang disisipkan. Kemudian gunakan pernyataan sql untuk melakukan session.createSQLQuery(sql).uniqueResult(); dan pernyataan kueri SQL akan dicetak. Terjadi masalah, tidak ada data yang dapat ditanyakan. Dalam hal ini, gunakan metode session.flush(), jalankan metode flush() sebelum membuat kueri, dan konsol keluaran akan mencetak pernyataan SQL yang dimasukkan. Jika Anda bertanya lagi, Anda akan memiliki data.
Setelah verifikasi selesai, saya cek informasi di atas. Mengenai poin keempat, sering muncul selama proses pengembangan. Saya yakin banyak orang yang mengalaminya, tetapi banyak orang yang masih bingung. Ini semakin memperdalam kesannya.
Dari konsol pencetakan SQL, kita dapat melihat proses operasi metode penyimpanan hibernasi dasar:
1. Tentukan apakah instance yang akan disimpan sudah dalam status persisten, dan jika belum, letakkan di cache;
2. Rencanakan pernyataan penyisipan sql berdasarkan instance yang akan disimpan. Perhatikan bahwa ini hanya direncanakan dan tidak dieksekusi;
3. Pernyataan penyisipan yang direncanakan sebelumnya dieksekusi ketika transaksi dilakukan;
Ganti tx.commit() dengan session.flush. Saat ini, kontrol mencetak pernyataan penyisipan, tetapi tidak ada catatan baru yang ditambahkan ke database;
Fungsi utama metode flush adalah membersihkan cache dan memaksa database melakukan sinkronisasi dengan cache Hibernate untuk memastikan konsistensi data. Tindakan utamanya adalah mengirimkan serangkaian pernyataan SQL ke database dan mengeksekusi pernyataan SQL tersebut, namun tidak akan mengirimkannya ke database. Metode komit pertama-tama akan memanggil metode flush dan kemudian melakukan transaksi. Inilah sebabnya mengapa catatan tidak dimasukkan ke dalam database ketika kita baru saja memanggil flush, karena pembaruan pada database tidak akan disimpan sampai transaksi dilakukan. Karena metode commit secara implisit memanggil flush, biasanya kita tidak memanggil metode flush secara eksplisit.
Ini adalah mekanisme flush hibernasi. Dalam proses memperbarui dan menyimpan beberapa objek kompleks, perlu dipertimbangkan apakah perubahan urutan operasi database dan apakah penundaan flush berdampak pada hasil program. Jika memang ada dampaknya, Anda dapat menambahkan flush di mana Anda perlu menjaga urutan operasi untuk memaksa Hibernate membuang operasi yang dicatat dalam cache ke dalam database. Ini mungkin tidak terlihat bagus, namun sangat efektif.
Pertanyaan: Metode session.save dimasukkan ke dalam cache dan tidak dapat ditemukan oleh SQL yang menanyakan database secara langsung.
Setelah metode flush(), SQL yang dieksekusi akan dicetak, tetapi masih belum ada di database. Kueri SQL langsung dapat menemukan data.
1. Di mana data entitas disimpan setelah flush()? Cachenya sama dengan metode save(), jadi SQL seharusnya tidak bisa mendapatkannya.
2. Karena data tidak masuk ke database setelah metode flush, SQL dapat langsung diquery menggunakan session.createSQLQuery(sql) untuk melakukan query.