ABOUT ME

Today
Yesterday
Total
  • JPA에서 `orphanRemoval`과 `CascadeType.REMOVE` 차이
    JPA 2024. 10. 9. 23:21

    개요

    JPA에서 orphanRemovalCascadeType.REMOVE는 엔티티 삭제 시 다른 방식으로 동작한다. 이 둘의 차이를 이해하려면 각각의 개념과 동작 방식을 알아야 한다.

    orphanRemovalCascadeType.REMOVE 기본 동작

    orphanRemoval

    • 부모 엔티티에서 자식 엔티티를 컬렉션에서 제거하면 자식 엔티티가 고아가 되어 자동으로 삭제된다.
    • 자식이 부모 엔티티 없이 존재할 수 없도록 한다.

    CascadeType.REMOVE

    • 부모 엔티티가 삭제될 때만 연관된 자식 엔티티가 함께 삭제된다.
    • 부모가 삭제될 때 자식도 함께 삭제되는 전이 동작을 의미한다.

    동일하게 동작하는 경우

    • 부모 엔티티가 삭제될 때, 자식 엔티티도 삭제되는 경우.
    • orphanRemovalCascadeType.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: 부모가 삭제될 때만 자식이 삭제된다.

    참고 자료

Designed by Tistory.