Nyanserna i merge()-metoden

Om du vill använda Hibernate för att ändra ett objekt som redan har lagrats i databasen, så finns det också flera metoder för detta.

Den första är metoden merge() , som uppdaterar informationen i databasen baserat på det skickade objektet . Detta kommer att anropa SQL UPDATE-frågan. Exempel:

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 finns flera viktiga nyanser här.

Först returnerar metoden merge() resultatet, det uppdaterade objektet. Detta objekt har ett beständigt tillstånd och är kopplat till sessionsobjektet. Objektet som skickas till merge() -metoden ändras inte.

Det kan tyckas att det inte är någon skillnad mellan användare och användare2, men det är det inte. Du kan skicka ett POJO-objekt till metoden merge() , och som ett resultat kan metoden returnera en proxy (beroende på Hibernate-inställningarna). Så kom bara ihåg att merge() -metoden inte ändrar det skickade objektet.

För det andra, om objektet som skickas till merge() har Transient-status (och det inte har ett ID), kommer en separat rad att skapas för det i databasen. Med andra ord kommer kommandot persist() att köras .

För det tredje, om ett objekt som redan är kopplat till sessionen (med statusen Persist) skickas till merge()- metoden, kommer ingenting att hända - metoden kommer helt enkelt att returnera samma objekt. Varför? Och allt för att när transaktionen genomförs kommer data ändå att skrivas till 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 finns ingen anledning att spara objektet varje gång efter någon av dess ändringar. Om det här objektet är i Persist-status kommer Hibernate att göra allt själv. Om du ändrar ett objekt som är "fäst till basen", kommer alla dess ändringar att skrivas till basen.

Nyanserna i update()-metoden

Hibernate har också en update()- metod , som, liksom save()- metoden , ärvdes från tidigare versioner. Med den här metoden kan du bara uppdatera data för ett redan sparat objekt. Detta kommer att anropa SQL UPDATE-frågan. Exempel:

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

Denna metod returnerar ingenting och ändrar inte det befintliga objektet.

Om du anropar den här metoden på ett nytt objekt, kommer ett undantag helt enkelt att kastas:

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

saveOrUpdate() metod

Före tillkomsten av JPA utfördes funktionen för metoden persist() av ​​metoden saveOrUpdate() . Hans uppgift var att uppdatera informationen om det befintliga objektet i databasen, och om det inte finns något, skapa det. Det används nästan alltid i stället för metoderna save() och update() .

Till skillnad från metoden update() kan den ändra objektet som skickas till det. Ange till exempel det ID som tilldelades när du sparade till databasen. Exempel:

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

Hur det fungerar:

  • om det skickade objektet har ett ID anropas UPDATE SQL-metoden
  • om ID för det skickade objektet inte är inställt, anropas INSERT SQL-metoden