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
GO TO FULL VERSION