์์์ฑ ์ ์ด CASCADE
ํน์ ์ํฐํฐ๋ฅผ ์์ ์ํ๋ก ๋ง๋ค ๋ ์ฐ๊ด๋ ์ํฐํฐ๋ ํจ๊ป ์์ ์ํ๋ก ๋ง๋ค๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค .
์) ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ์ ์ฅํ ๋ ์์ ์ํฐํฐ๋ ํจ๊ป ์ ์ฅํ๊ณ ์ถ์๋ ์ฌ์ฉ
์ง๊ธ ํ์ฌ Parent์ child๋ ์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ๋ก ๋งบ์ด์ง ์ํฉ์ ๋๋ค.
Parent parent = new Parent();
Child child1 = new Child();
Child child2 = new Child();
parent.addChild(child1);
parent.addChild(child2);
em.persist(parent);
em.persist(child1);
em.persist(child2);
์ฌ๊ธฐ์ ์ธ๊ฐ์ง ์ธ์คํด์ค๋ฅผ ๋ชจ๋ ์์ํ ์ํค๊ธฐ ์ํด์๋ em.persist()๋ฅผ 3๋ฒ ํธ์ถํด์
Parent์ Child ๊ฐ๊ฐ ๋ชจ๋ ์์ํ ์์ผ์ฃผ๋ ์์ ์ ์งํํด์ผํฉ๋๋ค.
์ฌ๊ธฐ์ ๋ค์๊ณผ ๊ฐ์ ์๋ฌธ์ด ๋ญ๋๋ค.
Parent๊ฐ ๊ด๋ฆฌํ๋ Child ์ธ์คํด์ค์ ๊ฒฝ์ฐ Parent๋ฅผ em.persist()ํ ๋ ๊ฐ์ด ์งํํ๋ฉด ํธํ์ง ์์๊น?
์ด๋ฌํ ์ง๋ฌธ์ ํด๊ฒฐํ ์ ์๋ ์ต์ ์ด ๋ฐ๋ก Cascade,์์์ฑ ์ ์ด์ ๋๋ค.
@OneToMany(mappedBy = "parent",cascade = CascadeType.ALL)
private List<Child> childList = new ArrayList<>();
cascade = CascadeType.ALL ์ค์
em.persist(parent);
// em.persist(child1);
// em.persist(child2);
parent ๋ง persist() ํด๋ child ๋ ๋ค persist() ๋๋ค.
Cascade์ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด 6๊ฐ์ง์ ์ข ๋ฅ๊ฐ ์์ต๋๋ค.
- ALL
- PERSIST
- REMOVE
- MERGE
- REFERESH
- DETACH
ํ์ง๋ง ์ ์ ์ฃผ๋ก ์ฌ์ฉํ๊ฒ ๋๋ ๊ฒ์ ALL ๋๋ PESIST์ ๋๋ค.
ALL์ ๊ฒฝ์ฐ์ ์์ ํด๋นํ๋ ๋ชจ๋ ์์์ฑ์ด ์ ์ด๋๋ ๊ฒฝ์ฐ์ด๊ณ
Persist์ ๊ฒฝ์ฐ ์ํฐํฐ๊ฐ ์ ์ฅ๋ ๋๋ง ์ฐ์์ ์ผ๋ก ์ ์ฅ๋๊ฒ ํ๋ ์ต์ ์ ๋๋ค.
Cascade๋ฅผ ์ธ์ ์จ์ผ ํ๋?
Cascade๋๋ ์ํฐํฐ์ Cascade๋ฅผ ์ค์ ํ๋ ์ํฐํฐ์ ๋ผ์ดํ์ฌ์ดํด์ด ๋์ผํ๊ฑฐ๋ ๋น์ทํด์ผํ๋ค.
Cascade๋๋ ์ํฐํฐ๊ฐ Cascade๋ฅผ ์ค์ ํ๋ ์ํฐํฐ์์๋ง ์ฌ์ฉ๋์ด์ผ ํ๋ค.
( ๋จ์ผ ์์ ์ : child ๋ฅผ parent ๋ง ์์ )
๊ณ ์ ๊ฐ์ฒด
๋ถ๋ชจ์ ์ฐ๊ด๊ด๊ณ๊ฐ ๋์ด์ง ์ํฐํฐ๋ฅผ ๊ณ ์๊ฐ์ฒด
@OneToMany(mappedBy = "parent",cascade = CascadeType.ALL,orphanRemoval = true)
private List<Child> childList = new ArrayList<>();
orphanRemoval=true : ๊ณ ์๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ์ญ์ ํด์ฃผ๋ ์ต์ ์ ํ์ฑํ
parent1.getChildList().remove(0);
//์์ ์ํฐํฐ๋ฅผ ์ปฌ๋ ์
์์ ์ ๊ฑฐํ๋ค
์ฃผ์์ฌํญ
์ฐธ์กฐํ๋ ๊ณณ์ด ํ๋์ผ ๋๋ง ์ฌ์ฉํด์ผํ๋ค !
ํน์ ์ํฐํฐ๊ฐ ๊ฐ์ธ ์์ ํ ๋๋ง ์ฌ์ฉํด์ผ ํ๋ค !
๊ฐ๋ ์ ์ผ๋ก ๋ถ๋ชจ๋ฅผ ์ ๊ฑฐํ๋ฉด ์์์ ๊ณ ์๊ฐ ๋๋ค.
๋ฐ๋ผ์ ๊ณ ์ ๊ฐ์ฒด ์ ๊ฑฐ ๊ธฐ๋ฅ์ ํ์ฑํํ๋ฉด , ๋ถ๋ชจ๋ฅผ ์ ๊ฑฐํ ๋ ์์๋ ํจ๊ป ์ ๊ฑฐ๋๋ค.
์ด๊ฒ์ CascadeType.REMOVE ์ฒ๋ผ ๋์ํ๋ค .
์์์ฑ ์ ์ด CASCADE + ๊ณ ์ ๊ฐ์ฒด , ์๋ช ์ฃผ๊ธฐ
cascade = CascadeType.ALL,orphanRemoval = true
CascadeType.ALL + orphanRemoval=true ์ด๊ฒ์ ๋ค ํค๋ฉด ๋ฌด์จ ์๋ฏธ์ผ๊น?
๋ ์ต์ ์ ๋ชจ๋ ํ์ฑํํ๋ฉด ๋ถ๋ชจ ์ํฐํฐ๋ฅผ ํตํด์ ์์์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๋ค.
https://hongchangsub.com/jpa-cascade-2/
<JPA> ์๊ณ ์ฐ๋ Cascade(์์์ฑ ์ ์ด)
์ด๋ฒ ํฌ์คํ ์์๋ ์ฐ๋ฉด์๋ ํท๊ฐ๋ฆฌ๋ JPA์ Cascade ์ต์ ์ ๋ํด์ ์ ๋ฆฌํ๊ฒ ์ต๋๋ค.์ผ๋จ ๊ธฐ๋ณธ์ ์ผ๋ก Cascade๋ผ๋ ์ต์ ์ด ๋ฑ์ฅํ๊ฒ ๋ ๋ฐฐ๊ฒฝ๋ถํฐ ์์๋ด ์๋ค. ์๋์ ์ฝ๋๋ฅผ ๋ณด์์ฃ @Setter @Getter @Entity
hongchangsub.com
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ - ์ธํ๋ฐ | ๊ฐ์
JPA๋ฅผ ์ฒ์ ์ ํ๊ฑฐ๋, ์ค๋ฌด์์ JPA๋ฅผ ์ฌ์ฉํ์ง๋ง ๊ธฐ๋ณธ ์ด๋ก ์ด ๋ถ์กฑํ์ ๋ถ๋ค์ด JPA์ ๊ธฐ๋ณธ ์ด๋ก ์ ํํํ๊ฒ ํ์ตํด์ ์ด๋ณด์๋ ์ค๋ฌด์์ ์์ ์๊ฒ JPA๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค., - ๊ฐ์ ์๊ฐ | ์ธํ๋ฐ
www.inflearn.com