Apa perbedaan antara persist () dan merge () di Hibernate?
persist()
dapat membuat kueri UPDATE & INSERT, misalnya:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
A a=new A();
session.persist(a);
a.setName("Mario");
session.flush();
dalam hal ini query akan dibuat seperti ini:
Hibernate: insert into A (NAME, ID) values (?, ?)
Hibernate: update A set NAME=? where ID=?
sehingga persist()
metode dapat menghasilkan Sisipan dan Pembaruan.
Sekarang dengan merge()
:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
Inilah yang saya lihat di database:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Madonna
3 Elvis Presley
4 Luciano Pavarotti
Sekarang perbarui catatan menggunakan merge()
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setId(2);
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
Inilah yang saya lihat di database:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Luciano Pavarotti
3 Elvis Presley
Jawaban:
Spesifikasi JPA berisi deskripsi semantik yang sangat tepat dari operasi ini, lebih baik daripada di javadoc:
sumber
persist
vsmerge
?Ini berasal dari
JPA
. Dengan cara yang sangat sederhana:persist(entity)
harus digunakan dengan entitas yang benar-benar baru, untuk menambahkannya ke DB (jika entitas sudah ada di DB, akan ada lemparan EntityExistsException).merge(entity)
harus digunakan, untuk mengembalikan entitas ke konteks ketekunan jika entitas dilepas dan diubah.sumber
Tetap harus dipanggil hanya pada entitas baru, sedangkan penggabungan dimaksudkan untuk melampirkan kembali entitas yang terpisah.
Jika Anda menggunakan generator yang ditetapkan, menggunakan merge dan bukan persist dapat menyebabkan pernyataan SQL yang berlebihan , sehingga memengaruhi performa.
Selain itu, memanggil gabungan untuk entitas yang dikelola juga merupakan kesalahan karena entitas yang dikelola secara otomatis dikelola oleh Hibernate dan status mereka disinkronkan dengan rekaman database dengan mekanisme pemeriksaan kotor saat membersihkan Konteks Persistensi .
sumber
Perbedaan terpenting adalah ini:
Dalam kasus
persist
metode, jika entitas yang akan dikelola dalam konteks persistensi, sudah ada dalam konteks persistensi, yang baru akan diabaikan. (Tidak ada yang terjadi)Namun dalam kasus
merge
metode, entitas yang telah dikelola dalam konteks persistensi akan diganti dengan entitas baru (diperbarui) dan salinan entitas yang diperbarui ini akan dikembalikan. (mulai sekarang setiap perubahan harus dilakukan pada entitas yang dikembalikan ini jika Anda ingin mencerminkan perubahan Anda dalam konteks ketekunan)sumber