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