De nuances van de merge() methode

Als je Hibernate wilt gebruiken om een ​​object te wijzigen dat al in de database is opgeslagen, dan zijn daar ook verschillende methoden voor.

De eerste is de methode merge() , die de informatie in de database bijwerkt op basis van het doorgegeven object . Hiermee wordt de SQL UPDATE-query aangeroepen. Voorbeeld:

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

Er zijn hier verschillende belangrijke nuances.

Eerst retourneert de methode merge() het resultaat, het bijgewerkte object. Dit object heeft de status Persist en is gekoppeld aan het sessieobject. Het object dat wordt doorgegeven aan de methode merge() verandert niet.

Het lijkt misschien dat er geen verschil is tussen user en user2, maar dat is het niet. U kunt een POJO-object doorgeven aan de methode merge() en als resultaat kan de methode een proxy retourneren (afhankelijk van de Hibernate-instellingen). Onthoud dus dat de methode merge() het doorgegeven object niet verandert.

Ten tweede, als het object dat is doorgegeven aan merge() de status Transient heeft (en geen ID heeft), wordt er een aparte regel voor gemaakt in de database. Met andere woorden, de opdracht persist() wordt uitgevoerd .

Ten derde, als een object dat al aan de sessie is gekoppeld (met de Persist-status) wordt doorgegeven aan de merge()- methode, gebeurt er niets - de methode retourneert gewoon hetzelfde object. Waarom? En dat allemaal omdat wanneer de transactie is vastgelegd, de gegevens toch naar de database worden geschreven:

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

Het is niet nodig om het object elke keer na een wijziging op te slaan. Als dit object de status Persist heeft, doet Hibernate alles zelf. Als u een object wijzigt dat "aan de basis is bevestigd", worden alle wijzigingen naar de basis geschreven.

De nuances van de update() methode

Hibernate heeft ook een methode update() , die net als de methode save() is overgenomen van eerdere versies. Met deze methode kunt u alleen de gegevens van een reeds opgeslagen object bijwerken. Hiermee wordt de SQL UPDATE-query aangeroepen. Voorbeeld:

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

Deze methode retourneert niets en verandert het bestaande object niet.

Als u deze methode op een nieuw object aanroept, wordt er gewoon een uitzondering gegenereerd:

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

saveOrUpdate()-methode

Vóór de komst van JPA werd de functie van de persist() methode uitgevoerd door de saveOrUpdate() methode . Zijn taak was om de informatie over het bestaande object in de database bij te werken en, als die er niet is, deze aan te maken. Het wordt bijna altijd gebruikt in plaats van de methoden save() en update() .

In tegenstelling tot de methode update() kan deze het object wijzigen dat eraan wordt doorgegeven. Stel deze bijvoorbeeld in op de ID die is toegewezen bij het opslaan in de database. Voorbeeld:

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

Hoe het werkt:

  • als het doorgegeven object een ID heeft, wordt de UPDATE SQL-methode aangeroepen
  • als de ID van het doorgegeven object niet is ingesteld, wordt de INSERT SQL-methode aangeroepen