Nuansa metode merge()

Jika Anda ingin menggunakan Hibernasi untuk mengubah objek yang sudah tersimpan di database, ada juga beberapa metode untuk ini.

Yang pertama adalah metode merge() , yang memperbarui informasi dalam database berdasarkan objek yang diteruskan . Ini akan memanggil kueri SQL UPDATE. Contoh:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

User user2 = (User) session.merge(user);

Ada beberapa nuansa penting di sini.

Pertama, metode merge() mengembalikan hasilnya, objek yang diperbarui. Objek ini memiliki status Persist dan dilampirkan ke objek sesi. Objek yang diteruskan ke metode merge() tidak berubah.

Tampaknya tidak ada perbedaan antara pengguna dan pengguna2, tetapi sebenarnya tidak. Anda dapat meneruskan objek POJO ke metode merge() , dan sebagai hasilnya, metode tersebut dapat mengembalikan proxy (bergantung pada pengaturan Hibernasi). Jadi ingat saja bahwa metode merge() tidak mengubah objek yang diteruskan.

Kedua, jika objek yang diteruskan ke merge() memiliki status Transient (dan tidak memiliki ID), maka baris terpisah akan dibuat untuknya di database. Dengan kata lain, perintah persist() akan dieksekusi .

Ketiga, jika objek yang sudah dilampirkan ke sesi (dengan status Persist) diteruskan ke metode merge() , maka tidak akan terjadi apa-apa - metode hanya akan mengembalikan objek yang sama. Mengapa? Dan semua karena ketika transaksi dilakukan, data akan tetap ditulis ke database:

User user = new User();
user.setName("Kolyan");
session.save(user);

user.setName("Masha"); //change the object attached to the session

session.close();  //all changed objects will be written to the database

Tidak perlu menyimpan objek setiap kali setelah ada perubahan. Jika objek ini dalam status Persist, maka Hibernasi akan melakukan semuanya sendiri. Jika Anda mengubah objek yang "dipasang ke pangkalan", maka semua perubahannya akan ditulis ke pangkalan.

Nuansa metode update()

Hibernasi juga memiliki metode update() , yang, seperti metode save() , diwarisi dari versi sebelumnya. Dengan metode ini, Anda hanya dapat memperbarui data objek yang sudah disimpan. Ini akan memanggil kueri SQL UPDATE. Contoh:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

session.update(user);

Metode ini tidak mengembalikan apa pun dan tidak mengubah objek yang ada.

Jika Anda memanggil metode ini pada objek baru, maka pengecualian akan dilemparkan begitu saja:

User user = new User();
user.setName("Kolyan");
session.update(user);   //an exception will be thrown here

metode saveOrUpdate()

Sebelum munculnya JPA, fungsi metode persist() dilakukan oleh metode saveOrUpdate() . Tugasnya adalah memperbarui informasi tentang objek yang ada di database, dan jika tidak ada, buatlah. Ini hampir selalu digunakan sebagai pengganti metode save() dan update() .

Berbeda dengan metode update() , metode ini dapat mengubah objek yang diteruskan ke sana. Misalnya, setel ke ID yang ditetapkan saat menyimpan ke database. Contoh:

User user = new User();
user.setName("Kolyan");
session.saveOrUpdate(user);   //object will be written to the database

Bagaimana itu bekerja:

  • jika objek yang diteruskan memiliki ID, maka metode UPDATE SQL dipanggil
  • jika ID objek yang diteruskan tidak disetel, maka metode INSERT SQL akan dipanggil