Die Nuancen der merge()-Methode

Wenn Sie Hibernate verwenden möchten, um ein Objekt zu ändern, das bereits in der Datenbank gespeichert ist, dann gibt es auch hierfür mehrere Methoden.

Die erste ist die Methode merge() , die die Informationen in der Datenbank basierend auf dem übergebenen Objekt aktualisiert . Dadurch wird die SQL UPDATE-Abfrage aufgerufen. Beispiel:

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

Hier gibt es mehrere wichtige Nuancen.

Zunächst gibt die Methode merge() das Ergebnis zurück, das aktualisierte Objekt. Dieses Objekt hat den Status „Persist“ und ist an das Sitzungsobjekt angehängt. Das an die Methode merge() übergebene Objekt ändert sich nicht.

Es scheint, dass es keinen Unterschied zwischen Benutzer und Benutzer2 gibt, aber das ist nicht der Fall. Sie können ein POJO-Objekt an die Methode merge() übergeben , und als Ergebnis kann die Methode einen Proxy zurückgeben (abhängig von den Hibernate-Einstellungen). Denken Sie also daran, dass die Methode merge() das übergebene Objekt nicht ändert.

Zweitens: Wenn das an merge() übergebene Objekt den Status „Transient“ hat (und keine ID hat), wird in der Datenbank eine separate Zeile dafür erstellt. Mit anderen Worten, der Befehl persist() wird ausgeführt .

Drittens passiert nichts, wenn ein Objekt, das bereits an die Sitzung angehängt ist (mit dem Status „Persist“) , an die Methode merge() übergeben wird – die Methode gibt einfach dasselbe Objekt zurück. Warum? Und das alles, weil die Daten beim Festschreiben der Transaktion trotzdem in die Datenbank geschrieben werden:

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

Es ist nicht erforderlich, das Objekt nach jeder Änderung zu speichern. Wenn sich dieses Objekt im Status „Persist“ befindet, erledigt Hibernate alles selbst. Wenn Sie ein Objekt ändern, das „an der Basis befestigt“ ist, werden alle seine Änderungen in die Basis geschrieben.

Die Nuancen der update()-Methode

Hibernate verfügt außerdem über eine update()- Methode , die ebenso wie die save()- Methode von früheren Versionen geerbt wurde. Mit dieser Methode können Sie nur die Daten eines bereits gespeicherten Objekts aktualisieren. Dadurch wird die SQL UPDATE-Abfrage aufgerufen. Beispiel:

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

Diese Methode gibt nichts zurück und verändert das vorhandene Objekt nicht.

Wenn Sie diese Methode für ein neues Objekt aufrufen, wird einfach eine Ausnahme ausgelöst:

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

saveOrUpdate()-Methode

Vor dem Aufkommen von JPA wurde die Funktion der Methode persist() von der Methode saveOrUpdate() ausgeführt . Seine Aufgabe bestand darin, die Informationen zum vorhandenen Objekt in der Datenbank zu aktualisieren und, falls keines vorhanden ist, es zu erstellen. Es wird fast immer anstelle der Methoden save() und update() verwendet .

Im Gegensatz zur update()- Methode kann sie das ihr übergebene Objekt ändern. Legen Sie beispielsweise die ID fest, die beim Speichern in der Datenbank zugewiesen wurde. Beispiel:

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

Wie es funktioniert:

  • Wenn das übergebene Objekt eine ID hat, wird die UPDATE-SQL-Methode aufgerufen
  • Wenn die ID des übergebenen Objekts nicht festgelegt ist, wird die SQL-Methode INSERT aufgerufen