Nuancerne i merge()-metoden

Hvis du vil bruge Hibernate til at ændre et objekt, der allerede er gemt i databasen, så er der også flere metoder til dette.

Den første er merge()- metoden , som opdaterer oplysningerne i databasen baseret på det beståede objekt . Dette vil påkalde SQL UPDATE-forespørgslen. 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);

Der er flere vigtige nuancer her.

Først returnerer merge() -metoden resultatet, det opdaterede objekt. Dette objekt har en persist-tilstand og er knyttet til sessionsobjektet. Objektet, der sendes til merge() -metoden , ændres ikke.

Det kan se ud til, at der ikke er nogen forskel på bruger og bruger2, men det er det ikke. Du kan sende et POJO-objekt til merge()- metoden , og som et resultat kan metoden returnere en proxy (afhængigt af Hibernate-indstillingerne). Så husk bare, at merge() -metoden ikke ændrer det beståede objekt.

For det andet, hvis objektet, der sendes til merge() har Transient-status (og det ikke har et ID), vil der blive oprettet en separat linje til det i databasen. Med andre ord vil kommandoen persist() blive udført .

For det tredje, hvis et objekt, der allerede er knyttet til sessionen (med Persist-status), videregives til merge()- metoden, vil der ikke ske noget - metoden vil blot returnere det samme objekt. Hvorfor? Og alt sammen fordi, når transaktionen er begået, vil dataene alligevel blive skrevet 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ødvendigt at gemme objektet hver gang efter nogen af ​​dets ændringer. Hvis dette objekt er i Persist-status, vil Hibernate gøre alt selv. Hvis du ændrer et objekt, der er "knyttet til basen", så vil alle dets ændringer blive skrevet til basen.

Nuancerne i update()-metoden

Hibernate har også en update()- metode , der ligesom save()- metoden blev arvet fra tidligere versioner. Med denne metode kan du kun opdatere dataene for et allerede gemt objekt. Dette vil påkalde SQL UPDATE-forespørgslen. 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 metode returnerer ikke noget og ændrer ikke det eksisterende objekt.

Hvis du kalder denne metode på et nyt objekt, vil en undtagelse simpelthen blive kastet:

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

saveOrUpdate() metode

Før fremkomsten af ​​JPA blev funktionen af ​​persist() -metoden udført af saveOrUpdate()- metoden . Hans opgave var at opdatere oplysningerne om det eksisterende objekt i databasen, og hvis der ikke er nogen, så oprette det. Det bruges næsten altid i stedet for save() og update() metoderne .

I modsætning til update()- metoden kan den ændre det objekt, der sendes til det. Indstil det f.eks. til det ID, der blev 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 virker:

  • hvis det beståede objekt har et ID, kaldes UPDATE SQL-metoden
  • hvis ID'et for det beståede objekt ikke er angivet, kaldes INSERT SQL-metoden