Nuanțele metodei merge().

Dacă doriți să utilizați Hibernate pentru a schimba un obiect care a fost deja stocat în baza de date, atunci există și câteva metode pentru aceasta.

Prima este metoda merge() , care actualizează informațiile din baza de date pe baza obiectului transmis . Aceasta va invoca interogarea SQL UPDATE. Exemplu:

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);

Există mai multe nuanțe importante aici.

În primul rând, metoda merge() returnează rezultatul, obiectul actualizat. Acest obiect are o stare Persist și este atașat obiectului sesiune. Obiectul trecut la metoda merge() nu se modifică.

Poate părea că nu există nicio diferență între user și user2, dar nu este. Puteți trece un obiect POJO la metoda merge() și, ca rezultat, metoda poate returna un proxy (în funcție de setările Hibernate). Deci, amintiți-vă că metoda merge() nu schimbă obiectul transmis.

În al doilea rând, dacă obiectul trecut la merge() are starea Tranzitorie (și nu are un ID), atunci o linie separată va fi creată pentru el în baza de date. Cu alte cuvinte, comanda persist() va fi executată .

În al treilea rând, dacă un obiect deja atașat la sesiune (cu starea Persist) este trecut la metoda merge() , atunci nu se va întâmpla nimic - metoda va returna pur și simplu același obiect. De ce? Și totul pentru că atunci când tranzacția este efectuată, oricum datele vor fi scrise în baza de date:

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

Nu este nevoie să salvați obiectul de fiecare dată după oricare dintre modificările acestuia. Dacă acest obiect este în starea Persist, atunci Hibernate va face totul singur. Dacă schimbați un obiect care este „atașat la bază”, atunci toate modificările acestuia vor fi scrise pe bază.

Nuanțele metodei update().

Hibernate are, de asemenea, o metodă update() , care, ca și metoda save() , a fost moștenită din versiunile anterioare. Cu această metodă, puteți actualiza doar datele unui obiect deja salvat. Aceasta va invoca interogarea SQL UPDATE. Exemplu:

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);

Această metodă nu returnează nimic și nu schimbă obiectul existent.

Dacă apelați această metodă pe un obiect nou, atunci pur și simplu va fi aruncată o excepție:

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

SaveOrUpdate() Metoda

Înainte de apariția JPA, funcția metodei persist() era îndeplinită de metoda saveOrUpdate() . Sarcina lui a fost să actualizeze informațiile despre obiectul existent în baza de date și, dacă nu există, să le creeze. Este aproape întotdeauna folosit în locul metodelor save() și update() .

Spre deosebire de metoda update() , aceasta poate schimba obiectul transmis. De exemplu, setați-l la ID-ul care a fost atribuit la salvarea în baza de date. Exemplu:

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

Cum functioneaza:

  • dacă obiectul transmis are un ID, atunci se apelează metoda UPDATE SQL
  • dacă ID-ul obiectului transmis nu este setat, atunci se apelează metoda INSERT SQL