Was ist der Unterschied zwischen persist() und merge() in JPA und Hibernate?
Was ist der Unterschied zwischen persist() und merge() in den Ruhezustand?
persist()
können, erstellen Sie einen UPDATE & INSERT-Abfrage, zB:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
A a=new A();
session.persist(a);
a.setName("Mario");
session.flush();
in diesem Fall Abfrage generiert wird, wie diese:
Hibernate: insert into A (NAME, ID) values (?, ?)
Hibernate: update A set NAME=? where ID=?
so persist()
Methode kann generieren eine Insert-und eine Update.
Nun mit merge()
:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
Dies ist, was ich sehe in der Datenbank:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Madonna
3 Elvis Presley
4 Luciano Pavarotti
Nun einen Datensatz aktualisieren 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();
Dies ist, was ich sehe in der Datenbank:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Luciano Pavarotti
3 Elvis Presley
- Die javadoc ist sehr explizit über was Sie tun, und was die Unterschiede sind. Haben Sie gelesen und verstanden?
- Check stackoverflow.com/questions/161224/...
- stackoverflow.com/questions/1069992/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
JPA-Spezifikation enthält eine sehr genaue Beschreibung der Semantik dieser Operationen, besser als in javadoc:
persist
vsmerge
?Das kommt von JPA. In einer sehr einfachen Weise:
persist(entity) verwendet werden, mit völlig neuen Einheiten, um Sie in DB (wenn Einheit existiert bereits in der DB gibt es EntityExistsException werfen).
merge(entity) werden verwendet, um entity wieder an persistenzkontext, wenn die Entität losgelöst und wurde geändert.
Fortbestehen sollte nur aufgerufen werden, auf neue Einrichtungen, während Zusammenführen soll anfügen Abgelöste Entitäten.
Wenn Sie mit der zugeteilten generator, mithilfe von merge statt fortbestehen kann zu einem redundanten SQL-Anweisung, daher Auswirkungen auf die performance.
Auch, Aufruf merge für verwaltete Einheiten ist auch ein Fehler da die verwalteten Einheiten werden automatisch verwaltet Hibernate und Ihr Zustand wird synchronisiert mit der Datenbank-Datensatz durch die dirty-checking-Mechanismus auf Spülen der Persistenz-Kontext.
der wichtigste Unterschied ist dieser:
Im Falle der persist-Methode , wenn die Entität, die verwaltet werden soll, in den Persistenz-Kontext ist bereits im persistenzkontext, der neue ignoriert wird. (NICHTS passiert)
Aber im Fall von merge-Methode, die Person, die sich schon im Persistenz-Kontext wird ersetzt durch die neue Entität (aktualisiert) und eine Kopie der aktualisierten Entität zurück. (von jetzt an keine änderungen vorgenommen werden, sollten an diese zurückgegeben Unternehmen, wenn Sie wollen, reflektieren Ihre änderungen in Persistenz-Kontext)