Niuanse metody merge().

Jeśli chcesz użyć Hibernate do zmiany obiektu, który był już przechowywany w bazie danych, istnieje również kilka metod.

Pierwsza to metoda merge() , która aktualizuje informacje w bazie danych na podstawie przekazanego obiektu . Spowoduje to wywołanie zapytania SQL UPDATE. Przykład:

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

Jest tu kilka ważnych niuansów.

Najpierw metoda merge() zwraca wynik, zaktualizowany obiekt. Ten obiekt ma stan Persist i jest dołączony do obiektu sesji. Obiekt przekazany do metody merge() nie zmienia się.

Może się wydawać, że nie ma różnicy między użytkownikiem a użytkownikiem2, ale tak nie jest. Możesz przekazać obiekt POJO do metody merge() , w wyniku czego metoda może zwrócić proxy (w zależności od ustawień Hibernate). Pamiętaj więc tylko, że metoda merge() nie zmienia przekazanego obiektu.

Po drugie, jeśli obiekt przekazany do merge() ma status Transient (a nie posiada identyfikatora), to zostanie dla niego utworzona osobna linia w bazie danych. Innymi słowy, zostanie wykonane polecenie perpetu() .

Po trzecie, jeśli obiekt już dołączony do sesji (ze statusem Persist) zostanie przekazany do metody merge() , to nic się nie stanie – metoda po prostu zwróci ten sam obiekt. Dlaczego? A wszystko dlatego, że po zatwierdzeniu transakcji dane i tak zostaną zapisane w bazie danych:

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

Nie ma potrzeby każdorazowego zapisywania obiektu po każdej z jego zmian. Jeśli ten obiekt ma status Persist, Hibernate zrobi wszystko sam. Jeśli zmienisz obiekt, który jest „dołączony do bazy”, wszystkie jego zmiany zostaną zapisane w bazie.

Niuanse metody update().

Hibernate ma również metodę update() , która podobnie jak metoda save() została odziedziczona z poprzednich wersji. Tą metodą można zaktualizować tylko dane już zapisanego obiektu. Spowoduje to wywołanie zapytania SQL UPDATE. Przykład:

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

Ta metoda nic nie zwraca i nie zmienia istniejącego obiektu.

Jeśli wywołasz tę metodę na nowym obiekcie, po prostu zostanie zgłoszony wyjątek:

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

saveOrUpdate() Metoda

Przed pojawieniem się JPA funkcja metody perpetu() była realizowana przez metodę saveOrUpdate() . Jego zadaniem było zaktualizowanie informacji o istniejącym obiekcie w bazie danych, a jeśli takiego nie ma, to utworzenie go. Jest prawie zawsze używany zamiast metod save() i update() .

W przeciwieństwie do metody update() może zmienić przekazany do niej obiekt. Na przykład ustaw go na identyfikator, który został przypisany podczas zapisywania w bazie danych. Przykład:

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

Jak to działa:

  • jeśli przekazany obiekt ma identyfikator, wówczas wywoływana jest metoda UPDATE SQL
  • jeśli identyfikator przekazanego obiektu nie jest ustawiony, to wywoływana jest metoda INSERT SQL