[JPA] Cascade(영속성 전이)

Seongho·2023년 6월 16일
0

JPA

목록 보기
3/3

package jakarta.persistence;

Cascade란?

관계형 데이터베이스에도 cascade가 있다. 예를 들어, ON DELETE CASCADE는 어떤 tuple을 삭제할 때, 왜래키로 연결된 tuple을 함께 삭제하는 옵션이다.
JPA에서도 비슷하다.
엔티티의 상태 변화를 전이시키는 옵션이다. 양방향 매핑에서만 사용할 수 있다.

예제

만약, 게시글 역할을 하는 Board 엔티티가 있고, 각 게시글에 연결된 댓글 역할을 하는 Comment 엔티티가 있다면, Board와 Comment는 일대다 매핑이 된다. 만약, 다른 비지니스에서 Comment를 따로 사용하지 않는다면, Board와 Comment는 생명주기를 함께 하는 것이 바람직하다.
그러니까, Board 엔티티 객체가 persist() 될 때, Comment 엔티티 객체도 persist() 되는 것이 바람직하다.

@Entity
@Getter @Setter
public class Board {
//
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "board_id")
    private Long id;
//
    private String title;                   //제목
//
    private String BodyContent;             //본문
//    
    @OneToMany(mappedBy = "board", cascade = CascadeType.ALL)
    private List<Comment> comments = new ArrayList<>();     //댓글
}
@Entity
public class Comment {
//
    @Id @GeneratedValue
    @Column(name = "comment_id")
    private Long id;
//
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "board_id")			//다대일 단방향 
    private Board board;
}

위 예제를 보면, Board 와 Comment는 일대다 양방향 관계이다.
게시글이 사라지면 댓글도 사라지기 때문에, 두 엔티티는 생명주기를 같이 하는게 맞다고 생각되면 이때 cascade 옵션을 넣으면 된다.

CascadeType

  • All : 상위 엔티티에서 하위 엔티티로 모든 영속성이 전이된다.
  • Persist : 상위 엔티티를 영속화할 때, 하위 엔티티도 영속화 된다.
    ex) Board 객체를 persist() 하면 Comment 객체도 persist()된다.
  • Merge
  • Remove
  • Refresh
  • Detach

주의할 점

반드시 어느 한 엔티티의 생명주기에 의존하는 엔티티가 존재하는 경우 사용하자.

참고
https://gilssang97.tistory.com/71

profile
Record What I Learned

1개의 댓글

comment-user-thumbnail
2023년 8월 21일

ㄴㅇㅁㄹㄴㅁ

답글 달기