Jaka jest różnica między persist () i merge () w Hibernate?
persist()
może utworzyć zapytanie UPDATE & INSERT, np .:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
A a=new A();
session.persist(a);
a.setName("Mario");
session.flush();
w tym przypadku zapytanie zostanie wygenerowane w następujący sposób:
Hibernate: insert into A (NAME, ID) values (?, ?)
Hibernate: update A set NAME=? where ID=?
więc persist()
metoda może wygenerować wstawkę i aktualizację.
Teraz z merge()
:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
Oto co widzę w bazie danych:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Madonna
3 Elvis Presley
4 Luciano Pavarotti
Teraz zaktualizuj rekord za pomocą 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();
Oto co widzę w bazie danych:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Luciano Pavarotti
3 Elvis Presley
Odpowiedzi:
Specyfikacja JPA zawiera bardzo precyzyjny opis semantyki tych operacji, lepszy niż w javadoc:
źródło
persist
vsmerge
?To pochodzi z
JPA
. W bardzo prosty sposób:persist(entity)
powinien być używany z zupełnie nowymi encjami, aby dodać je do DB (jeśli jednostka już istnieje w DB, zostanie rzucony EntityExistsException).merge(entity)
powinien być używany, aby umieścić jednostkę z powrotem w kontekście trwałości, jeśli jednostka została odłączona i została zmieniona.źródło
Persist powinno być wywoływane tylko w przypadku nowych jednostek, podczas gdy scalanie ma na celu ponowne dołączenie odłączonych jednostek.
Jeśli używasz przypisanego generatora, użycie funkcji scalania zamiast trwałego może spowodować powstanie nadmiarowej instrukcji SQL , co wpłynie na wydajność.
Ponadto, nazywając seryjnej dla podmiotów zarządzanych jest również błędem, ponieważ podmioty zarządzane są automatycznie zarządzane przez Hibernate i ich stan jest zsynchronizowany z rekordu bazy danych przez mechanizm kontroli brudny po spłukiwania Context Persistence .
źródło
Najważniejsza różnica jest taka:
W przypadku
persist
metody, jeśli jednostka, która ma być zarządzana w kontekście trwałości, już istnieje w kontekście trwałości, nowa jest ignorowana. (Nic się nie stało)Jednak w przypadku
merge
metody jednostka, która jest już zarządzana w kontekście trwałości, zostanie zastąpiona nową jednostką (zaktualizowana), a kopia tej zaktualizowanej jednostki zostanie zwrócona. (od teraz wszelkie zmiany powinny być dokonywane w tej zwracanej encji, jeśli chcesz odzwierciedlić zmiany w kontekście trwałości)źródło