Ang mga nuances ng merge() na paraan

Kung nais mong gumamit ng Hibernate upang baguhin ang isang bagay na naimbak na sa database, mayroon ding ilang mga pamamaraan para dito.

Ang una ay ang merge() method , na nag-a-update ng impormasyon sa database batay sa naipasa na object . Gagawin nito ang query ng SQL UPDATE. Halimbawa:

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

Mayroong ilang mahahalagang nuances dito.

Una, ibinabalik ng merge() method ang resulta, ang na-update na object. Ang object na ito ay may Persist state at naka-attach sa session object. Ang bagay na ipinasa sa merge() na paraan ay hindi nagbabago.

Maaaring mukhang walang pagkakaiba sa pagitan ng user at user2, ngunit hindi. Maaari kang magpasa ng POJO object sa merge() method , at bilang resulta, ang paraan ay maaaring magbalik ng proxy (depende sa mga setting ng Hibernate). Kaya tandaan lamang na ang merge() na pamamaraan ay hindi nagbabago sa naipasa na bagay.

Pangalawa, kung ang bagay na ipinasa sa merge() ay may Transient status (at wala itong ID), pagkatapos ay isang hiwalay na linya ang gagawin para dito sa database. Sa madaling salita, ang persist() command ay isasagawa .

Pangatlo, kung ang isang bagay na naka-attach na sa session (na may Persist status) ay ipinasa sa merge() method, walang mangyayari - ibabalik lang ng method ang parehong object. Bakit? At lahat dahil kapag ang transaksyon ay ginawa, ang data ay isusulat pa rin sa database:

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

Hindi na kailangang i-save ang bagay sa bawat oras pagkatapos ng anuman sa mga pagbabago nito. Kung ang bagay na ito ay nasa Persist na katayuan, pagkatapos ay gagawin ng Hibernate ang lahat mismo. Kung babaguhin mo ang isang bagay na "naka-attach sa base", pagkatapos ang lahat ng mga pagbabago nito ay isusulat sa base.

Ang mga nuances ng update() na pamamaraan

Ang hibernate ay mayroon ding update() method , na, tulad ng save() method , ay minana mula sa mga nakaraang bersyon. Sa pamamaraang ito, maaari mo lamang i-update ang data ng isang na-save na bagay. Gagawin nito ang query ng SQL UPDATE. Halimbawa:

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

Ang pamamaraang ito ay hindi nagbabalik ng anuman at hindi nagbabago sa umiiral na bagay.

Kung tatawagin mo ang pamamaraang ito sa isang bagong bagay, kung gayon ang isang pagbubukod ay itatapon lamang:

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

saveOrUpdate() Paraan

Bago ang pagdating ng JPA, ang function ng persist() method ay isinagawa ng saveOrUpdate() method . Ang kanyang gawain ay i-update ang impormasyon sa umiiral na bagay sa database, at kung wala, pagkatapos ay likhain ito. Ito ay halos palaging ginagamit bilang kapalit ng save() at update() na mga pamamaraan .

Hindi tulad ng update() method , maaari nitong baguhin ang bagay na ipinasa dito. Halimbawa, itakda ito sa ID na itinalaga noong nagse-save sa database. Halimbawa:

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

Paano ito gumagana:

  • kung ang naipasa na bagay ay may ID, ang UPDATE SQL method ay tinatawag
  • kung ang ID ng naipasa na bagay ay hindi nakatakda, pagkatapos ay ang INSERT SQL method ay tinatawag