[JPA] orphanRemoval

이다혜·2023년 12월 13일
0

Spring

목록 보기
22/27

orphanRemoval

JPA에서 관계 매핑에서 사용되는 속성 중 하나로, 이 속성을 사용하면 부모 엔티티에서 자식 엔티티를 제거할 때 해당 자식 엔티티를 데이터베이스에서도 자동으로 제거할 수 있다.

orphanRemoval = true로 설정하면, 부모 엔티티의 컬렉션에서 제거된 자식 엔티티가 더 이상 다른 엔티티에 의해 참조되지 않으면 해당 자식 엔티티를 자동으로 삭제한다.

게시글과 댓글로 간단한 예시를 들어본다.

Article

게시글 엔티티는 댓글 엔티티의 컬렉션을 가지고 있다.

@Entity
public class Article {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;

    @OneToMany(mappedBy = "article", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<ArticleComment> comments = new ArrayList<>();

}

ArticleComment

@Entity
public class ArticleComment {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String content;

    @ManyToOne
    private Article article;

}

이 상황에서 article.getComments().remove(articleComment)가 실행되면 댓글이 comments 컬렉션에서 제거되면서 자동으로 데이터베이스에서도 삭제된다.

CASCADE DELETE와 혼동 주의
cascade delete는 부모 엔티티가 삭제될 때, 그와 연관된 자식 엔티티들도 함께 삭제되도록 지정하는 기능
즉, 게시글이 삭제되면 게시글에 달린 댓글들도 삭제되도록 하는 것이고


orphanRemoval은 부모 엔티티에서 자식 엔티티를 제거할 때, 해당 자식 엔티티를 데이터베이스에서도 자동으로 제거하는 기능
즉, 게시글의 댓글 List에서 댓글을 삭제하면 데이터베이스에서도 삭제되는 것(단, 어떤 다른 엔티티에 의해서도 참조되지 않을 경우)

0개의 댓글