actualizare vs metoda de fuziune în hibernate (Programare, Java, Hibernate)

Daniel a intrebat.
a intrebat.

Înțeleg că update este folosit pentru a pune un obiect detașat în stare persistentă dacă niciun alt obiect cu același id și tip nu este atașat la sesiune. Merge nu se ocupă de stări. Pur și simplu returnează un obiect persistat de același tip dacă nu există în sesiune sau actualizează vechiul obiect cu valorile noului obiect. Întrebările mele se referă la accesarea bazei de date. Metodele „update” și „merge” lovesc imediat baza de date sau modificările sunt vizibile în baza de date atunci când sesiunea este închisă.

Editare: Ce se întâmplă dacă apelăm metoda „update” pe o instanță persistă prin metoda „save”?. Credeam că metoda „update” se folosește doar pentru instanțele detașate.

4 răspunsuri
Adya

Hibernate se ocupă de persistența oricăror modificări ale obiectelor din sesiune atunci când sesiunea este curățată. update poate eșua dacă o instanță a obiectului se află deja în sesiune. Merge ar trebui să fie utilizat în acest caz. Aceasta fuzionează modificările obiectului detașat cu un obiect din sesiune, dacă acesta există.

Update: dacă sunteți sigur că sesiunea nu conține o instanță deja persistentă cu același identificator, atunci utilizați update pentru a salva datele în hibernate.

Merge: dacă doriți să vă salvați modificările în orice moment fără a cunoaște starea unei sesiuni, atunci utilizați merge() în hibernate.

Atunci când instanța entității se află în stare persistentă, toate modificările pe care le faceți la câmpurile mapate ale acestei instanțe vor fi aplicate înregistrărilor și câmpurilor corespunzătoare din baza de date la închiderea sesiunii. Instanța persistentă poate fi considerată ca fiind „online”, în timp ce instanța detașată a devenit „offline” și nu este monitorizată pentru modificări.

Acest lucru înseamnă că, atunci când modificați câmpurile unui obiect persistent, nu trebuie să apelați save, update sau oricare dintre aceste metode pentru a transfera aceste modificări în baza de date: tot ce trebuie să faceți este să confirmați tranzacția, să spălați sau să închideți sesiunea, atunci când ați terminat cu ea.Este important să înțelegeți că toate metodele (persist, save, update, merge, saveOrUpdate) nu au ca rezultat imediat instrucțiunile SQL UPDATE sau INSERT corespunzătoare. Salvarea efectivă a datelor în baza de date are loc la confirmarea tranzacției sau la ștergerea sesiunii.

Comentarii

  • Sunt de acord cu tot ceea ce ați spus. Ați spus: „Metoda Merge va unifica modificările din ambele stări ale obiectului și –>va salva în baza de date <—.”. Am evidențiat întrebarea mea între două săgeți în răspunsul dumneavoastră. Întrebarea mea este când? Aceste modificări sunt salvate în baza de date atunci când sesiunea este închisă sau imediat ce metoda este apelată. –  > Por Daniel.
  • Mi-am editat răspunsul, vă rog să vedeți dacă vă rezolvă sau nu întrebarea. –  > Por Adya.
Sumit Singh

În caz de fuziune:Când apelăm metoda de fuziune pe instanța detașată, aceasta va fi actualizată cu valoarea actualizată.

În cazul actualizării Atunci când apelăm metoda de actualizare a instanței detașate, se va crea o excepție. org.hibernate.NonUniqueObjectException

Nikhil Kamani

Toate metodele din hibernate

  • save

  • merge

  • saveOrUpdate

  • Actualizare

  • Delete

nu are ca rezultat imediat o actualizare sau o inserare sql.

Salvarea efectivă a datelor are loc în momentul în care efectuăm confirmarea sau ștergerea sesiunii.

Vidya vid

Uneori ne confruntăm cu situația în care baza de date a aplicației este modificată de o aplicație/agent extern și, astfel, entitatea hibernate corespunzătoare din aplicația dvs. devine de fapt nesincronizată cu reprezentarea sa în baza de date, adică are date vechi. În acest caz, puteți utiliza session.refresh() pentru a reumple entitatea cu cele mai recente date disponibile în baza de date.

Puteți utiliza una dintre metodele refresh() metode din interfața Session pentru a reîmprospăta o instanță a unui obiect persistentMethod merge() face exact opusul a ceea ce face refresh() adică actualizează baza de date cu valorile dintr-o entitate detaș ată. Metoda de reîmprospătare actualiza entitatea cu cele mai recente informații din baza de date. Deci, practic, ambele sunt exact opuse.

Fuziunea se realizează atunci când se dorește ca o entitate detașată să treacă din nou în stare persistentă, cu modificările entității detașate migrate în baza de date (sau suprapuse).

Documentația oficială a Hibernate oferă o explicație foarte bună despre merge() metoda:

Copiază starea obiectului dat pe obiectul persistent cu același identificator. Dacă nu există o instanță persistentă asociată în prezent cu sesiunea, aceasta va fi încărcată. Se returnează instanța persistentă. Dacă instanța dată nu este salvată, se salvează o copie a acesteia și se returnează ca instanță nou persistentă. Instanța dată nu devine asociată cu sesiunea. Această operațiune se aplică în cascadă la instanțele asociate dacă asocierea este mapată cu cascade=”merge”.

Referință