JPA에서 관계 매핑에서 사용되는 속성 중 하나로, 이 속성을 사용하면 부모 엔티티에서 자식 엔티티를 제거할 때 해당 자식 엔티티를 데이터베이스에서도 자동으로 제거할 수 있다.
orphanRemoval = true로 설정하면, 부모 엔티티의 컬렉션에서 제거된 자식 엔티티가 더 이상 다른 엔티티에 의해 참조되지 않으면 해당 자식 엔티티를 자동으로 삭제한다.
게시글과 댓글로 간단한 예시를 들어본다.
게시글 엔티티는 댓글 엔티티의 컬렉션을 가지고 있다.
@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<>();
}
@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에서 댓글을 삭제하면 데이터베이스에서도 삭제되는 것(단, 어떤 다른 엔티티에 의해서도 참조되지 않을 경우)