A merge() metódus árnyalatai

Ha az adatbázisban már tárolt objektumot a hibernálással kívánja megváltoztatni, akkor erre több módszer is létezik.

Az első a merge() metódus , amely az átadott objektum alapján frissíti az adatbázisban lévő információkat . Ez meghívja az SQL UPDATE lekérdezést. Példa:

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

Itt van néhány fontos árnyalat.

Először a merge() metódus adja vissza az eredményt, a frissített objektumot. Ennek az objektumnak Persist állapota van, és a munkamenet objektumhoz van csatolva. A merge() metódusnak átadott objektum nem változik.

Úgy tűnhet, hogy nincs különbség user és user2 között, de nem az. Egy POJO objektumot átadhat a merge() metódusnak , és ennek eredményeként a metódus visszaadhat egy proxyt (a hibernált beállításoktól függően). Tehát ne feledje, hogy a merge() metódus nem változtatja meg az átadott objektumot.

Másodszor, ha a merge()- nek átadott objektum átmeneti állapotú (és nincs azonosítója), akkor külön sor jön létre neki az adatbázisban. Más szavakkal, a persist() parancs végrehajtásra kerül .

Harmadszor, ha egy, a munkamenethez már csatolt objektumot (Persist állapotú) átadunk a merge() metódusnak, akkor semmi sem fog történni – a metódus egyszerűen ugyanazt az objektumot adja vissza. Miért? És mindez azért, mert a tranzakció véglegesítésekor az adatok úgyis bekerülnek az adatbázisba:

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

Nincs szükség az objektumot minden módosítás után menteni. Ha ez az objektum Persist állapotban van, akkor a Hibernate mindent maga végez. Ha módosít egy objektumot, amely „az alaphoz van csatolva”, akkor minden módosítása az alapra kerül.

Az update() metódus árnyalatai

A Hibernate-nek van egy update() metódusa is , amely a save() metódushoz hasonlóan a korábbi verziókból örökölt. Ezzel a módszerrel csak egy már elmentett objektum adatait frissítheti. Ez meghívja az SQL UPDATE lekérdezést. Példa:

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

Ez a metódus nem ad vissza semmit, és nem változtatja meg a meglévő objektumot.

Ha ezt a metódust egy új objektumon hívja meg, akkor a rendszer egyszerűen kivételt dob:

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

saveOrUpdate() metódus

A JPA megjelenése előtt a persist() metódus funkcióját a saveOrUpdate() metódus látta el . Feladata az volt, hogy frissítse az adatbázisban meglévő objektum információit, és ha nincs, akkor létrehozza. Szinte mindig ezt használják a save() és update() metódusok helyett .

Az update() metódussal ellentétben képes megváltoztatni a neki átadott objektumot. Például állítsa be azt az azonosítót, amelyet az adatbázisba mentésekor hozzárendelt. Példa:

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

Hogyan működik:

  • ha az átadott objektumnak van azonosítója, akkor az UPDATE SQL metódus kerül meghívásra
  • ha az átadott objektum azonosítója nincs beállítva, akkor az INSERT SQL metódus kerül meghívásra