Cascade 옵션은 엔티티의 상태 변화를 전파시키는 옵션이다. 따라서 OneToMany 관계나 ManyToOne 관계를 맺는 엔티티의 상태 변화를 전이시킬 때 사용이 가능하다.
이게 무슨말일까?? 영속성에 대한 개념과 DB 커넥션에 대해 알지 못하면 이해하기 어렵다.
엔티티들은 크게 네 가지 상태를 갖는다. 아래 그림은 엔티티들이 갖는 상태 변화를 그림으로 나타낸 것이다.
갑자기 Cascade 옵션에서 엔티티의 상태에 대한 얘기가 왜 나왔을까? → Cascade 옵션은 상태 전이를 위한 옵션이기 때문이다.
예시를 위해서 게시물과 댓글 엔티티가 각각 있다고 생각해보자.
게시물 하나에는 여러 댓글이 생성될 수 있다. 즉 OneToMany 관계를 갖고 있다. 대게는 Many 엔티티에서 FK를 가지고 있으므로 댓글 엔티티에서 게시물 엔티티의 PK를 FK로 갖고 있을 것이다. 그런데 만약에 게시물이 제거된다면? 더 이상 댓글들은 존재할 필요가 없다.
그러나 게시물을 delete하여 제거하더라도 댓글들이 상태 변화를 바로 알 수 없다. 그래서 Cascade 옵션을 사용하여 게시물이 제거되었다는 상태를 전이시키는 것이다.
@Entity
class Post (
@OneToMany(mappedBy = "post", cascade = ALL)
private HashSet<Comment> comments = HashSet()
public void addComment(comment:Comment){
this.comments.add(comment)
comment.post = this
}
}