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
GO TO FULL VERSION