Nyansene til merge()-metoden

Hvis du ønsker å bruke Hibernate til å endre et objekt som allerede er lagret i databasen, så finnes det også flere metoder for dette.

Den første er merge()- metoden , som oppdaterer informasjonen i databasen basert på det beståtte objektet . Dette vil påkalle SQL UPDATE-spørringen. Eksempel:

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

Det er flere viktige nyanser her.

Først returnerer merge() -metoden resultatet, det oppdaterte objektet. Dette objektet har en persist-tilstand og er knyttet til øktobjektet. Objektet som sendes til merge() -metoden endres ikke.

Det kan virke som det ikke er noen forskjell mellom bruker og bruker2, men det er det ikke. Du kan sende et POJO-objekt til merge()- metoden , og som et resultat kan metoden returnere en proxy (avhengig av Hibernate-innstillingene). Så bare husk at merge() -metoden ikke endrer det beståtte objektet.

For det andre, hvis objektet som sendes til merge() har Transient-status (og det ikke har en ID), vil det opprettes en egen linje for det i databasen. Med andre ord, kommandoen persist() vil bli utført .

For det tredje, hvis et objekt som allerede er knyttet til sesjonen (med Persist-status) sendes til merge()- metoden, vil ingenting skje - metoden vil ganske enkelt returnere det samme objektet. Hvorfor? Og alt fordi når transaksjonen er forpliktet, vil dataene uansett skrives til databasen:

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

Det er ikke nødvendig å lagre objektet hver gang etter noen av endringene. Hvis dette objektet er i Persist-status, vil Hibernate gjøre alt selv. Hvis du endrer et objekt som er "festet til basen", vil alle endringene bli skrevet til basen.

Nyansene til update()-metoden

Hibernate har også en update()- metode , som i likhet med save()- metoden ble arvet fra tidligere versjoner. Med denne metoden kan du bare oppdatere dataene til et allerede lagret objekt. Dette vil påkalle SQL UPDATE-spørringen. Eksempel:

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

Denne metoden returnerer ikke noe og endrer ikke det eksisterende objektet.

Hvis du kaller denne metoden på et nytt objekt, vil et unntak ganske enkelt bli kastet:

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

saveOrUpdate()-metoden

Før bruken av JPA ble funksjonen til persist() -metoden utført av saveOrUpdate()- metoden . Hans oppgave var å oppdatere informasjonen om det eksisterende objektet i databasen, og hvis det ikke er noen, så opprette det. Den brukes nesten alltid i stedet for metodene save() og update() .

I motsetning til update()- metoden , kan den endre objektet som sendes til den. Sett den for eksempel til IDen som ble tildelt ved lagring i databasen. Eksempel:

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

Hvordan det fungerer:

  • hvis det beståtte objektet har en ID, kalles UPDATE SQL-metoden
  • hvis ID-en til det beståtte objektet ikke er angitt, kalles INSERT SQL-metoden