๊ฐ๋ฅํ ๊ฐ์ฒด ์ํ ์ต์
์๋ค์ํผ, ๊ฐ์ฒด๊ฐ Hibernate์ ์ฐ๊ฒฐ๋ ๋ ๊ทธ ์ํ๋ Persistent ๋๋ Managed ๋ผ๊ณ ํฉ๋๋ค . ์ผ๋ง๋ ๋ง์ต๋๊น? ์ง์ ๋๋ ๊ด๋ฆฌ?
๊ฐ๋ฅํฉ๋๋ค. JPA ์ฌ์์ ๋ฐ๋ฅด๋ฉด ๊ฐ์ฒด๋ Persist ์ํ๋ฅผ ๊ฐ์ง๋ฉฐ Hibernate ์ฌ์์ ๋ฐ๋ฅด๋ฉด ํด๋น ์ํ๋ฅผ Managed๋ผ๊ณ ํฉ๋๋ค.
Hibernate์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ org.hibernate.Session ์ ํ์ ๊ฐ์ฒด๋ฅผ ํตํด ์ํ๋ฉ๋๋ค . JPA์ ๋ฐ๋ฅด๋ฉด ํด๋์ค๋ javax.persistence.EntityManager๋ผ๊ณ ํด์ผ ํฉ๋๋ค. ๋ ์ ํ ๋ชจ๋ ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ํฐ ๋ฌธ์ ๊ฐ ์๋๋๋ค.
org.hibernate.Session ์ธํฐํ์ด์ค๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธ๋ฉ๋๋ค.
interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager, QueryProducer, java.io.Serializable, SharedSessionContract {
}
๋ฐ๋ผ์ Session ์ธํฐํ์ด์ค์๋ EntityManager ์ธํฐํ์ด์ค ์ ์๋ ๋ชจ๋ ๋ฉ์๋๊ฐ ์์ต๋๋ค . ๊ทธ๋ฌ๋ ์์ง JPA ์ฌ์์ด ์์์ ๋ ์ด์ ๋ฒ์ ์ Hibernate์์ ๋ฌผ๋ ค๋ฐ์ ๊ณ ์ ํ ๊ธฐ๋ฅ๋ ์์ต๋๋ค.
์ด ์ ์ฒด ์ํฉ์ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช ๋ฉ๋๋ค.

์ธ์ ์ธํฐํ์ด์ค์ ์๋ ๋ชจ๋ ๋ฐฉ๋ฒ๊ณผ ์์ ์ ๋์์ค๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
persist() ๋ฉ์๋์ ๋์์ค
๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ๋ ๋ ๊ฐ์ง๋ฅผ ๊ธฐ์ตํด์ผ ํฉ๋๋ค.
์ฒซ์งธ, ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ฉด ๊ฒฐ๊ตญ SQL ๋ช ๋ น(INSERT ๋๋ UPDATE) ์ค ํ๋๊ฐ ์คํ๋ฉ๋๋ค. ๋์งธ, ์ด๋ฌํ ์์ ์ ๊ฐ์ฒด์ ๋ฉ์๋๋ฅผ ํธ์ถํ ์งํ์ ๋ฐ์ํ์ง ์์ต๋๋ค.์ธ์ , ํ์ง๋ง ํธ๋์ญ์ ์ ์ข ๋ฃํ ํ์๋ง ๊ฐ๋ฅํฉ๋๋ค.
์๋ฅผ ๋ค์ด User ํด๋์ค ๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค .
@Entity
public class User {
@Id
@GeneratedValue
public Integer id;
@Columnt(name=โuser_nameโ)
public String name;
}
persist() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํด ๋ณด๊ฒ ์ต๋๋ค .
User user = new User();
user.setName("Kolyan");
session.persist(user);
์ด ๋ฐฉ๋ฒ์ ๋ชฉ์ ์ ์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌํ ๊ฐ์ฒด๊ฐ ์์ง ์์ผ๋ฉด INSERT SQL ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ถ๊ฐ๋ฉ๋๋ค .
๊ฐ์ฒด๊ฐ ์ด๋ฏธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์์ผ๋ฉด ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ธ ๋ฒ์งธ ๊ฒฝ์ฐ๋ ๊ฐ๋ฅํฉ๋๋ค. ๋ถ๋ฆฌ๋จ ์ํ์ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ๋ ค๋ ์๋์ ๋๋ค. ์ด ๊ฒฝ์ฐ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค. ์:
User user = new User();
user.setName("Kolyan");
session.persist(user);
session.evict(user); // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!
save() ๋ฉ์๋์ ๋์์ค
save() ๋ฉ์๋๋ ์ด์ ๋ฒ์ ์์ ํ์ฌ Hibernate์ ์ํด ์์๋์์ต๋๋ค. ๋ณธ์ง์ ์ผ๋ก ์ด๋ persist() ๋ฉ์๋์ ๋งค์ฐ ์ ์ฌํ๋ฉฐ INSERT ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ด๋ธ์ ์ ๋ ์ฝ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ช ๊ฐ์ง ํฅ๋ฏธ๋ก์ด ๋์์ค๊ฐ ์์ต๋๋ค.
๋จผ์ ์ด ๋ฉ์๋๋ ๊ฐ์ฒด์ ์ ID์ธ ๊ฐ์ ๋ฐํํฉ๋๋ค . ์ด๋ฏธ ์๊ณ ์๋ฏ์ด ๊ฐ์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ถ๊ฐ๋๊ธฐ ์ ์ ID๊ฐ ์์ผ๋ฉฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ด๋ฏธ ํ ๋น๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ธ์ ๊ฐ์ฒด์ save() ๋ฉ์๋ ๋ ์ ์ฅ๋ ๊ฐ์ฒด์ ํ ๋น๋ ID๋ฅผ ๋ฐํํฉ๋๋ค.
์ค์ํ! Hibernate ID ๋ช ์ธ์ ๋ฐ๋ฅด๋ฉด ๊ทธ๊ฒ์ ๋จ์ง ์ซ์๊ฐ ์๋๋ผ ์ด๋ค ์ง๋ ฌํ ๊ฐ๋ฅํ ๊ฐ์ฒด๋ ๋ ์ ์๋ค. ๋ฌธ์์ด, ์ซ์, ์ด๊ฑฐํ ๋ฑ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ํ ์ด์ ์์ ํ ๋ฃ์ ์ ์๋ ๋ชจ๋ ๊ฒ์ด ๋ ์ ์์ต๋๋ค.
save() ๋ฉ์๋์๋ ์ง๋ ฌํ๋ ๊ฒฐ๊ณผ ์ ํ์ด ์์ผ๋ฏ๋ก ํด๋น ๊ฒฐ๊ณผ๋ฅผ ์ฌ๋ฐ๋ฅธ ์ ํ์ผ๋ก ์บ์คํธํด์ผ ํฉ๋๋ค.
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
๋ํ save() ๋ฉ์๋๋ ๊ฐ์ฒด์ Detached ์ํ์ธ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋์์ ํฉ๋๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ฅผ ์๋ก์ด ๊ฒ์ผ๋ก ๊ฐ์ฃผํ๊ณ ๋จ์ํ ๋ค๋ฅธ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค.
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
session.evict(user); // detach the object from the session
Integer id2 = (Integer) session.save(user);
id ๋ฐ id2 ๋ณ์๋ ๋ค๋ฆ ๋๋ค. ๊ฐ save() ์์ ์ ๋ํด ํ๋์ฉ ๋ ๊ฐ์ ๋ ์ฝ๋๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ ์ด๋ธ์ ์ถ๊ฐ๋ฉ๋๋ค .
GO TO FULL VERSION