Nuansa kaedah merge().

Jika anda ingin menggunakan Hibernate untuk menukar objek yang telah disimpan dalam pangkalan data, maka terdapat juga beberapa kaedah untuk ini.

Yang pertama ialah kaedah merge() , yang mengemas kini maklumat dalam pangkalan data berdasarkan objek yang diluluskan . Ini akan menggunakan pertanyaan 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);

Terdapat beberapa nuansa penting di sini.

Pertama, kaedah merge() mengembalikan hasil, objek yang dikemas kini. Objek ini mempunyai keadaan Persist dan dilampirkan pada objek sesi. Objek yang dihantar ke kaedah merge() tidak berubah.

Nampaknya tidak ada perbezaan antara pengguna dan pengguna2, tetapi tidak. Anda boleh menghantar objek POJO kepada kaedah merge() , dan sebagai hasilnya, kaedah itu boleh mengembalikan proksi (bergantung pada tetapan Hibernate). Jadi ingatlah bahawa kaedah merge() tidak mengubah objek yang diluluskan.

Kedua, jika objek yang dihantar ke merge() mempunyai status Transient (dan ia tidak mempunyai ID), maka baris yang berasingan akan dibuat untuknya dalam pangkalan data. Dengan kata lain, perintah persist() akan dilaksanakan .

Ketiga, jika objek yang telah dilampirkan pada sesi (dengan status Persist) diserahkan kepada kaedah merge() , maka tiada apa yang akan berlaku - kaedah itu hanya akan mengembalikan objek yang sama. kenapa? Dan semuanya kerana apabila transaksi dilakukan, data akan ditulis ke pangkalan data pula:

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 selepas sebarang perubahannya. Jika objek ini berada dalam status Persist, maka Hibernate akan melakukan semuanya sendiri. Jika anda menukar objek yang "dilekatkan pada pangkalan", maka semua perubahannya akan ditulis ke pangkalan.

Nuansa kaedah kemas kini().

Hibernate juga mempunyai kaedah update() , yang, seperti kaedah save() , telah diwarisi daripada versi sebelumnya. Dengan kaedah ini, anda hanya boleh mengemas kini data objek yang telah disimpan. Ini akan menggunakan pertanyaan 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);

Kaedah ini tidak mengembalikan apa-apa dan tidak mengubah objek sedia ada.

Jika anda memanggil kaedah ini pada objek baru, maka pengecualian hanya akan dilemparkan:

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

Kaedah saveOrUpdate().

Sebelum kemunculan JPA, fungsi kaedah persist() telah dilakukan oleh kaedah saveOrUpdate() . Tugasnya adalah untuk mengemas kini maklumat mengenai objek sedia ada dalam pangkalan data, dan jika tidak ada, kemudian buatnya. Ia hampir selalu digunakan sebagai ganti kaedah save() dan update() .

Tidak seperti kaedah update() , ia boleh menukar objek yang dihantar kepadanya. Sebagai contoh, tetapkannya kepada ID yang telah diberikan semasa menyimpan ke pangkalan data. Contoh:

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

Bagaimana ia berfungsi:

  • jika objek yang diluluskan mempunyai ID, maka kaedah UPDATE SQL dipanggil
  • jika ID objek yang diluluskan tidak ditetapkan, maka kaedah INSERT SQL dipanggil