-
JPA에서 `orphanRemoval`과 `CascadeType.REMOVE` 차이JPA 2024. 10. 9. 23:21
개요
JPA에서
orphanRemoval
과CascadeType.REMOVE
는 엔티티 삭제 시 다른 방식으로 동작한다. 이 둘의 차이를 이해하려면 각각의 개념과 동작 방식을 알아야 한다.orphanRemoval
과CascadeType.REMOVE
기본 동작orphanRemoval
- 부모 엔티티에서 자식 엔티티를 컬렉션에서 제거하면 자식 엔티티가 고아가 되어 자동으로 삭제된다.
- 자식이 부모 엔티티 없이 존재할 수 없도록 한다.
CascadeType.REMOVE
- 부모 엔티티가 삭제될 때만 연관된 자식 엔티티가 함께 삭제된다.
- 부모가 삭제될 때 자식도 함께 삭제되는 전이 동작을 의미한다.
동일하게 동작하는 경우
- 부모 엔티티가 삭제될 때, 자식 엔티티도 삭제되는 경우.
orphanRemoval
과CascadeType.REMOVE
둘 다 부모 엔티티가 삭제될 때 자식도 함께 삭제된다.
@Entity class Parent { @OneToMany(mappedBy = "parent", cascade = CascadeType.REMOVE, orphanRemoval = true) private List<Child> children = new ArrayList<>(); } @Entity class Child { @ManyToOne private Parent parent; } // 부모 엔티티 삭제 시 자식 엔티티도 함께 삭제된다. Parent parent = entityManager.find(Parent.class, parentId); entityManager.remove(parent);
다르게 동작하는 경우
- 부모 엔티티가 삭제되지 않고 부모의 컬렉션에서 자식만 제거되는 경우.
orphanRemoval의 동작
- 부모의 컬렉션에서 자식 엔티티를 제거하면 자식이 고아가 되어 데이터베이스에서 삭제된다.
Parent parent = entityManager.find(Parent.class, parentId); Child child = parent.getChildren().get(0); parent.getChildren().remove(child); // 부모의 컬렉션에서 자식 제거 // 트랜잭션 커밋 시 child는 DB에서 삭제된다
CascadeType.REMOVE의 동작
- 부모 엔티티가 삭제되지 않는 한 자식 엔티티는 그대로 남아 있다.
Parent parent = entityManager.find(Parent.class, parentId); Child child = parent.getChildren().get(0); parent.getChildren().remove(child); // 부모의 컬렉션에서 자식 제거 // 트랜잭션 커밋 시 child는 DB에서 여전히 남아 있다
요약
- orphanRemoval: 부모 컬렉션에서 자식을 제거하면 자식도 삭제된다.
- CascadeType.REMOVE: 부모가 삭제될 때만 자식이 삭제된다.
참고 자료
- Baeldung - JPA CascadeType.REMOVE vs orphanRemoval: https://www.baeldung.com/jpa-cascade-remove-vs-orphanremoval
'JPA' 카테고리의 다른 글
JPA Entity에 public or protected no-arg constructor가 필수인 이유 (1) 2024.10.09 JPA 연관 관계의 주인과 소유 측: 개념 및 예제 (0) 2024.05.04 JPA 연관 관계 어노테이션의 속성 분석 (0) 2024.05.04 JPA : 영속성 전이(Cascade) (0) 2024.05.02 Spring Data JPA 가이드 모음 (0) 2024.05.02