Was ist der Unterschied zwischen persist () und merge () im Ruhezustand?
persist()
kann eine UPDATE & INSERT-Abfrage erstellen, z.
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
A a=new A();
session.persist(a);
a.setName("Mario");
session.flush();
In diesem Fall wird die Abfrage wie folgt generiert:
Hibernate: insert into A (NAME, ID) values (?, ?)
Hibernate: update A set NAME=? where ID=?
So persist()
kann die Methode ein Einfügen und ein Aktualisieren generieren .
Jetzt mit merge()
:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
Folgendes sehe ich in der Datenbank:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Madonna
3 Elvis Presley
4 Luciano Pavarotti
Aktualisieren Sie nun einen Datensatz mit merge()
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setId(2);
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
Folgendes sehe ich in der Datenbank:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Luciano Pavarotti
3 Elvis Presley
Antworten:
Die JPA-Spezifikation enthält eine sehr genaue Beschreibung der Semantik dieser Operationen, besser als in Javadoc:
quelle
persist
vsmerge
?Das kommt von
JPA
. Auf sehr einfache Weise:persist(entity)
sollte mit völlig neuen Entitäten verwendet werden, um sie zur Datenbank hinzuzufügen (wenn die Entität bereits in der Datenbank vorhanden ist, wird EntityExistsException ausgelöst).merge(entity)
sollte verwendet werden, um die Entität wieder in den Persistenzkontext zu versetzen, wenn die Entität getrennt und geändert wurde.quelle
Persist sollte nur für neue Entitäten aufgerufen werden, während Merge dazu dient, getrennte Entitäten wieder zu verbinden.
Wenn Sie den zugewiesenen Generator verwenden, kann die Verwendung von Merge anstelle von Persist eine redundante SQL-Anweisung verursachen und somit die Leistung beeinträchtigen.
Das Aufrufen der Zusammenführung für verwaltete Entitäten ist ebenfalls ein Fehler, da verwaltete Entitäten automatisch von Hibernate verwaltet werden und ihr Status beim Löschen des Persistenzkontexts durch den Dirty-Checking-Mechanismus mit dem Datenbankdatensatz synchronisiert wird .
quelle
Der wichtigste Unterschied ist folgender:
persist
Wenn bei einer Methode die Entität, die im Persistenzkontext verwaltet werden soll, bereits im Persistenzkontext vorhanden ist, wird die neue ignoriert. (Nichts ist passiert)Im Falle einer
merge
Methode wird die Entität, die bereits im Persistenzkontext verwaltet wird, durch die neue Entität (aktualisiert) ersetzt, und eine Kopie dieser aktualisierten Entität wird zurückgegeben. (Von nun an sollten Änderungen an dieser zurückgegebenen Entität vorgenommen werden, wenn Sie Ihre Änderungen im Persistenzkontext widerspiegeln möchten.)quelle