cascade
โ ๋ถ๋ชจ ์ํฐํฐ์ ๋ณ๊ฒฝ์ด ์์ ์ํฐํฐ์๊ฒ ์ํฅ์ ์ค๋ค.
ex) team, member ์ team ์ ์์ฑํ๊ฑฐ๋ team ์ ์ญ์ ํ ๋ member ๋ ๊ฐ์ด ์์ฑ๋๊ณ ์ญ์ ๋๋ค.
orphan removal
โ ๋ถ๋ชจ ๊ฐ์ฒด์ ์์ ๋ณ์์์ ์์ ๊ฐ์ฒด๊ฐ ์ญ์ ๋์์ ๋ ์์ ์ํฐํฐ๋ฅผ ์ญ์ ํ๋ ๊ฒ
ex) team, member ์ team ์ members ์์ member ์์ ํ๋๊ฐ ์ญ์ ๋์์ ๋ ํด๋น ์ํฐํฐ๊ฐ ์ฐ๊ด์์ ์ญ์ ๋๋ค.
์ฃผ์์ : hibernate5.6 ๊ธฐ์ค orphan removal ์ cascade ์ ์์ฑ์ ์ํฅ์ ๋ฐ๋๋ค. cascade ๊ฐ persist ์ด๊ฑฐ๋ all ์ผ๋๋ง ์ ํจํ๋ค.
์์
ํ๊ฒฝ
โข
Team, Member ๋ OneToMany ๋จ๋ฐฉํฅ
cascade ๊ฐ remove ์ผ ๋
entityManager.getTransaction().begin();
Team morak = entityManager.find(Team.class, 1);
entityManager.remove(morak);
entityManager.getTransaction().commit();
Java
๋ณต์ฌ
โ team ์ ์ญ์ ํ๋ฉด member ๋ ์ญ์ ๋๋ค. ๋ฌผ๋ก ์ ์ฝ์กฐ๊ฑด์ ์ํด member๊ฐ ๋จผ์ ์ญ์ ๋๋ค.
cascade ๊ฐ persist ์ด๊ณ orphan removal ์ผ ๋
entityManager.getTransaction().begin();
entityManager.persist(morak);
morak.removeMember(0);
entityManager.getTransaction().commit();
Java
๋ณต์ฌ
๊ฒฐ๊ณผ
Hibernate: insert into team (id, name) values (default, ?)
Hibernate: insert into member (id, name, team_id) values (default, ?, ?)
Hibernate: delete from member where id=?
Java
๋ณต์ฌ
orphan removal ์ด ์ ๋์ํ๋ค.
๊ฒฐ๋ก
โข
cascade remove ๋ team ์ด ์ญ์ ๋ ๋์ ์ํฉ
โข
orphan removal ์ team ์ members ์์ member ๊ฐ ์ญ์ ๋ ๋์ ์ํฉ
๋ฒ์ธ
cascade ๊ฐ persist ์ด๊ณ orphan removal=false(default) ์ผ ๋ ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ์ญ์ ํ๋ฉด
JdbcSQLIntegrityConstraintViolationException โ ์ ์ฝ์กฐ๊ฑด ์๋ฌ
cascade ๊ฐ persist ์ด๊ณ orphan removal=true ์ผ ๋ ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ์ญ์ ํ๋ฉด
entityManager.getTransaction().begin();
entityManager.persist(morak);
entityManager.remove(morak);
entityManager.getTransaction().commit();
Java
๋ณต์ฌ
Hibernate: insert into team (id, name) values (default, ?)
Hibernate: insert into member (id, name, team_id) values (default, ?, ?)
Hibernate: delete from member where id=?
Hibernate: delete from team where id=?
Java
๋ณต์ฌ
orphan removal ์ต์
์ ์ํด cascade remove ์ฒ๋ผ ๋์