merge() metodi bilan ishlashning nozik joylari
Agar sen Hibernate orqali bazada saqlangan ob'ektni o'zgartirmoqchi bo'lsang, buning uchun bir necha metodlar mavjud.
Birinchidan, bu merge() metodi, bu metod ob'ekt asosi bo'yicha bazadagi ma'lumotlarni yangilaydi. Bunda SQL-so'rov UPDATE chaqiriladi. Misol:
User user = new User();
user.setName("Kolyan");
session.save(user);
session.evict(user); // ob'ektni sessiyadan uzamiz
user.setName("Masha");
User user2 = (User) session.merge(user);
Bu yerda bir necha muhim nozik joylar bor.
Birinchidan, merge() metodi natija qaytaradi – yangilangan ob'ekt. Bu ob'ekt Persist holatiga ega va session ob'ektiga ulanadi. merge() metodiga yuborilgan ob'ekt o'zgarmaydi.
user va user2 o'rtasida farq yo'qdek tuyulishi mumkin, lekin bu unday emas. merge() metodiga POJO ob'ektini yuborish mumkin va natija sifatida metod proxy qaytarishi mumkin (Hibernate sozlamasiga bog'liq). Shuning uchun shunchaki eslaymizki, merge() metodi yuborilgan ob'ektni o'zgartirmaydi.
Ikkinchidan, agar merge() ga yuborilgan ob'ekt Transient holatiga ega bo'lsa (va ID'si bo'lmasa), unda bu uchun bazada alohida qator yaratiladi. Boshqacha so'z bilan, persist() komandasi bajariladi.
Uchinchidan, agar merge() metodiga session'ga ulangan ob'ekt (Persist holatida) yuborilsa, hech narsa sodir bo'lmaydi – metod shunchaki shu ob'ektni qaytaradi. Nima uchun? Chunki tranzaksiya kommitida ma'lumotlar bazaga yoziladi:
User user = new User();
user.setName("Kolyan");
session.save(user);
user.setName("Masha"); //sessiyaga ulangan ob'ektni o'zgartiramiz
session.close(); //bazaga barcha o'zgartirilgan ob'ektlar yoziladi
Ob'ektning har qanday o'zgarishidan keyin uni saqlash shart emas. Agar bu ob'ekt Persist holatida bo'lsa, Hibernate hammasini o'zi qiladi. Agar baza bilan "ulanadigan ob'ektni" o'zgartirsangiz, barcha o'zgarishlar bazaga yoziladi.
update() metodi bilan ishlashning nozik joylari
Shuningdek, Hibernate'da update() metodi mavjud, u save() metodi singari avvalgi versiyalardan unga o'tgan. Ushbu metod yordamida saqlangan ob'ektning ma'lumotlarini yangilash mumkin. Bunda SQL-so'rov UPDATE chaqiriladi. Misol:
User user = new User();
user.setName("Kolyan");
session.save(user);
session.evict(user); // ob'ektni sessiyadan uzamiz
user.setName("Masha");
session.update(user);
Bu metod hech narsa qaytarmaydi va mavjud ob'ektni o'zgartirmaydi.
Agar bu metod yangi ob'ektga chaqirilsa, faqatgina istisno tashlanadi:
User user = new User();
user.setName("Kolyan");
session.update(user); //bu yerda istisno tashlanadi
saveOrUpdate() metodi
JPA paydo bo'lishidan oldin, persist() metodining funksiyasini saveOrUpdate() metodi bajarar edi. Uning vazifasi mavjud ob'ektni bazada yangilash, agar mavjud bo'lmasa, uni yaratish edi. Uni deyarli har doim save() va update() metodlari o'rniga ishlatishadi.
update() metodidan farqli o'laroq, u yuborilgan ob'ektni o'zgartirishi mumkin. Masalan, bazaga saqlangan payt belgilangan ID'ni o'rnatish mumkin. Misol:
User user = new User();
user.setName("Kolyan");
session.saveOrUpdate(user); //ob'ekt bazaga yoziladi
Bunda bu qanday ishlaydi:
- agar yuborilgan ob'ektning ID'si belgilangan bo'lsa, SQL-metod UPDATE chaqiriladi
- agar yuborilgan ob'ektning ID'si belgilangan bo'lmasa, SQL-metod INSERT chaqiriladi
GO TO FULL VERSION