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() ๋ฉ์๋๋ ์ ๋ฐ์ดํธ๋ ๊ฐ์ฒด์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ์ด ๊ฐ์ฒด๋ ์ง์ ์ํ๋ฅผ ๊ฐ์ง๋ฉฐ ์ธ์ ๊ฐ์ฒด์ ์ฐ๊ฒฐ๋ฉ๋๋ค. merge() ๋ฉ์๋ ์ ์ ๋ฌ๋ ๊ฐ์ฒด๋ ๋ณ๊ฒฝ๋์ง ์์ต๋๋ค.
user์ user2 ์ฌ์ด์ ์ฐจ์ด๊ฐ ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ผ ์ ์์ง๋ง ๊ทธ๋ ์ง ์์ต๋๋ค. POJO ๊ฐ์ฒด๋ฅผ merge() ๋ฉ์๋ ์ ์ ๋ฌํ ์ ์์ผ๋ฉฐ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฉ์๋๋ ํ๋ก์๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค(Hibernate ์ค์ ์ ๋ฐ๋ผ ๋ค๋ฆ). ๋ฐ๋ผ์ merge() ๋ฉ์๋๋ ์ ๋ฌ๋ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ์ง ์๋๋ค๋ ์ ๋ง ๊ธฐ์ตํ์ธ์.
๋์งธ, merge() ์ ์ ๋ฌ๋ ๊ฐ์ฒด๊ฐ ์์ ์ํ(๊ทธ๋ฆฌ๊ณ ID๊ฐ ์์)์ด๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณ๋์ ์ค์ด ์์ฑ๋ฉ๋๋ค. ์ฆ, persist() ๋ช ๋ น์ด ์คํ๋ฉ๋๋ค .
์ ์งธ, ์ธ์ ์ ์ด๋ฏธ ์ฐ๊ฒฐ๋ ๊ฐ์ฒด(Persist ์ํ)๊ฐ merge() ๋ฉ์๋์ ์ ๋ฌ๋๋ฉด ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค. ๋ฉ์๋๋ ๋จ์ํ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์? ํธ๋์ญ์ ์ด ์ปค๋ฐ๋๋ฉด ์ด์จ๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ๋ก๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
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๋ ๋ํ save() ๋ฉ์๋ ์ฒ๋ผ ์ด์ ๋ฒ์ ์์ ์์๋ update() ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ฉด ์ด๋ฏธ ์ ์ฅ๋ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ง ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด 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() ๋ฉ์๋ ์ ์ํด ์ํ๋์์ต๋๋ค . ๊ทธ์ ์๋ฌด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ธฐ์กด ๊ฐ์ฒด์ ๋ํ ์ ๋ณด๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ์๋ ๊ฒฝ์ฐ ์๋ก ๋ง๋๋ ๊ฒ์ด์์ต๋๋ค. ์ด๊ฒ์ ๊ฑฐ์ ํญ์ save() ๋ฐ update() ๋ฉ์๋ ๋์ ์ฌ์ฉ๋ฉ๋๋ค .
update() ๋ฉ์๋ ์ ๋ฌ๋ฆฌ ์ ๋ฌ๋ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ๋ ํ ๋น๋ ID๋ก ์ค์ ํฉ๋๋ค. ์:
User user = new User();
user.setName("Kolyan");
session.saveOrUpdate(user); //object will be written to the database
์๋ ๋ฐฉ์:
- ์ ๋ฌ๋ ๊ฐ์ฒด์ ID๊ฐ ์์ผ๋ฉด UPDATE SQL ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
- ์ ๋ฌ๋ ๊ฐ์ฒด์ ID๊ฐ ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ INSERT SQL ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค.
GO TO FULL VERSION