Нюансите на метода merge().

Ако искате да използвате Hibernate, за да промените обект, който вече е съхранен в базата данни, има и няколко метода за това.

Първият е методът merge() , който актуализира информацията в базата данни въз основа на предадения обект . Това ще извика заявката SQL UPDATE. Пример:

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

Тук има няколко важни нюанса.

Първо, методът merge() връща резултата, актуализирания обект. Този обект има състояние Persist и е прикачен към обекта на сесията. Обектът, предаден на метода merge(), не се променя.

Може да изглежда, че няма разлика между потребител и потребител2, но не е така. Можете да предадете POJO обект на метода merge() и в резултат на това методът може да върне прокси (в зависимост от настройките на Hibernate). Така че просто не забравяйте, че методът merge() не променя подавания обект.

Второ, ако обектът, предаден на merge(), има статус Transient (и няма ID), тогава за него ще бъде създаден отделен ред в базата данни. С други думи, командата persist() ще бъде изпълнена .

Трето, ако обект, който вече е прикачен към сесията (със състояние Persist), бъде предаден на метода merge() , тогава нищо няма да се случи - методът просто ще върне същия обект. Защо? И всичко това, защото когато транзакцията е ангажирана, данните така or иначе ще бъдат записани в базата данни:

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

Няма нужда да записвате обекта всеки път след всяка негова промяна. Ако този обект е в състояние Persist, тогава Hibernate ще направи всичко сам. Ако промените обект, който е „прикрепен към основата“, тогава всички негови промени ще бъдат записани в основата.

Нюансите на метода update().

Hibernate също има метод update() , който, подобно на метода save() , е наследен от предишни версии. С този метод можете да актуализирате само данните на вече записан обект. Това ще извика заявката SQL UPDATE. Пример:

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

Този метод не връща нищо и не променя съществуващия обект.

Ако извикате този метод на нов обект, тогава просто ще бъде хвърлено изключение:

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

метод saveOrUpdate().

Преди появата на JPA, функцията на метода persist() се изпълняваше от метода saveOrUpdate() . Неговата задача беше да актуализира информацията за съществуващия обект в базата данни и ако няма такъв, да го създаде. Почти винаги се използва instead of методите save() и update() .

За разлика от метода update() , той може да промени обекта, който му е подаден. Например, задайте го на ID, който е бил зададен при записване в базата данни. Пример:

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

Как работи:

  • ако предаваният обект има ID, тогава се извиква методът UPDATE SQL
  • ако идентификаторът на предадения обект не е зададен, тогава се извиква методът INSERT SQL