JPA์์ ์ํฐํฐ๋ฅผ ์ ์ฅํ ๋ ์ฐ๊ด๋ ๋ชจ๋ ์ํฐํฐ๋ ์์ ์ํ์ฌ์ผ ํ๋ค.
๋ถ๋ชจ ์ํฐํฐ๋ฅผ ์์ ์ํ๋ก ๋ง๋ค ๋ ์ฐ๊ด๋ ์์๋ ํ๋ฒ์ ์์ ์ํ๋ก ๋ง๋ค ์ ์๋ค.
Cascade๋?
- ์์์ฑ ์ ์ด
- ์ฐ๊ด๊ด๊ณ์ ์๋ ์ํฐํฐ์ ์์ ์ด ์ด๋ฃจ์ด์ ธ ์ํ ๋ณํ๊ฐ ์ด๋ค์ง ์ ๋์ผํ ์์ ์ด ์ฐ๊ฒฐ๋ ์ํฐํฐ์ ์ ์ด๋๋ ์ต์
- ์ผ๋ฐ์ ์ผ๋ก ๋ถ๋ชจ ์ํฐํฐ์์ cascade ์ต์ ์ ๊ฑธ์ด์ค
- ์์์์ ๋ถ๋ชจ๋ก ์ต์ ์ ๊ฑฐ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์๋ค๊ณ ํจ
- ์ฆ์๋ก๋ฉ, ์ง์ฐ๋ก๋ฉ, ์ฐ๊ด๊ด๊ณ ์ธํ ๊ณผ ๊ด๊ณ ์์
- ๋ถ๋ชจ, ์์ ์ํฐํฐ์ ์ฐ๊ด๊ด๊ณ ์ฃผ์ธ(์ธ๋ํค ๊ด๋ฆฌ์)๋ ๋ค๋ฆ
Entity์ ์ํ
- Transient : JPA๊ฐ ๋ชจ๋ฅด๋ ์ํ (๋จ์ ๊ฐ์ฒด ์์ฑ)
- Persistent : JPA๊ฐ ๊ด๋ฆฌ์ค์ธ ์ํ (1์ฐจ ์บ์, Dirty Checking, Write Behind, โฆ)
- Detached : JPA๊ฐ ๋์ด์ ๊ด๋ฆฌํ์ง ์๋ ์ํ
- Removed : JPA๊ฐ ๊ด๋ฆฌํ๊ธด ํ์ง๋ง ์ญ์ ํ๊ธฐ๋ก ํ ์ํ
casecade ์ต์ (์ผ๋ถ)
PERSIST
- ์ํฐํฐ๋ฅผ ์์ํ ํ ๋ ์ฐ๊ด๋ ์ํฐํฐ๋ ํจ๊ป ์ ์ง
- Transient ์ธ์คํด์ค๋ฅผ Persistent๋ก ๋ง๋ค์ด์ค
REMOVE
- ์ํฐํฐ๋ฅผ ์ญ์ ํ ๋, ์ฐ๊ด๋ ์ํฐ๋ ํจ๊ป ์ญ์
ALL
- ๋ชจ๋ CASCADE ์ต์ ์ ์ฉ
- ๋ชจ๋ ์์ ์ ๋ถ๋ชจ์์ ์์ ์ํฐํฐ๋ก ์ ํ
์์
์๋ฌด๋ฐ ์ต์ ์ด ์๋ ๊ฒฝ์ฐ
Comment
@Entity
public class Comment {
@Id
@GeneratedValue
private Long id;
private String comment;
@ManyToOne
private Post post;
}
Post
@Entity
public class Post {
@Id
@GeneratedValue
private Long id;
private String title;
@OneToMany(mappedBy = "post")
private Set<Comment> comments = new HashSet<>();
public void addComment(Comment comment) {
this.getComments().add(comment);
comment.setPost(this);
}
}
Test ์ฝ๋
- ์์์ธ Comment๋ ์ ์ฅ๋์ง ์์
- id๊ฐ null์์ ํ์ธ
CascadeType.ALL์ ๊ฑด ๊ฒฝ์ฐ
- ๋ถ๋ชจ์ธ Post ์ํฐํฐ์์ ์์์ธ Comments์ ์ต์ ๊ฑธ๊ธฐ
- id๊ฐ null์ด ์๋์ ํ์ธ
๊ณ ์ ๊ฐ์ฒด ์ ๊ฑฐ
- JPA์์๋ ๋ถ๋ชจ ์ํฐํฐ์ ์ฐ๊ด๊ด๊ณ๊ฐ ๋์ด์ง ์์ ์ํฐํฐ๋ฅผ ์๋์ผ๋ก ์ญ์ ํ๋ ๊ธฐ๋ฅ ์ ๊ณต
- ์ฐธ์กฐ๊ฐ ์ ๊ฑฐ๋ ์ํฐํฐ๋ ๋ค๋ฅธ ๊ณณ์์ ์ฐธ์กฐํ์ง ์๋ ๊ณ ์ ๊ฐ์ฒด๋ก ๋ณด๊ณ ์ญ์
- ๋๋ฌธ์ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๊ฐ ํ๋์ผ ๋๋ง ์ฌ์ฉํด์ผ ํจ (ํน์ ์ํฐํฐ์์๋ง ์์ ํ๊ณ ์๋ ์ํฐํฐ)
@OneToOne
,@OneToMany
์์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
Example
- Comments ๊ฐ์ฒด๋ Post์์๋ง ์์ ํ๊ณ ์์
- Comments์
orphanRemoval
์ต์ ์ถ๊ฐ
- Comments๋ฅผ ์ ๊ฑฐํ์์ ๋,
- comment์ ๋ํด์ ๋ค์๊ณผ ๊ฐ์ด delete ์ฟผ๋ฆฌ๊ฐ ๋๊ฐ