인프런 커뮤니티 질문&답변

죽부인1님의 프로필 이미지
죽부인1

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

orphanRemoval = true 질문

해결된 질문

작성

·

308

0

Order 클래스 list에 orphanRemoval=true 를 주고

@OneToMany(mappedBy = "order", cascade = CascadeType.ALL , orphanRemoval=true)  
private List<OrderItem> orderItems = new ArrayList<>();

order.getOrderItems.remove(0); 를 써주면 Order-OrderItem 간의 부모자식 관계가 제거되어서 삭제되는데 추가도 되는지 궁금합니다.

  1. 주문 리스트 전체 변경을 진행하고 있습니다.

    Order 가 영속성 컨텍스트에 있을때

    추가될 Item들 findById로 영속성 컨텍스트로 불러온 다음 OrderItem으로 만든뒤

    public void addOrderItem(OrderItem orderItem) { 
        orderItems.add(orderItem); 
        orderItem.setOrder(this); 
    }

    order.addOrderItem(orderItem1);
    order.addOrderItem(orderItem2);

    다음과 같이 써주면 db에 추가될 수 있나요???

    제 테스트 상에서는 데이터가 입력이 되어서

    부모-관계가 없어지면 삭제되고 , 부모-관계를 연결시켜주면 추가된다고 생각해도 될까요?

답변 2

0

안녕하세요. 죽부인1님, 공식 서포터즈 David입니다.

  1. orphanRemoval 옵션은 부모가 삭제 되었을 때 자녀를 자동으로 삭제 시켜주는 것입니다.

  2. 단순히 데이터베이스에 OrderItem을 추가하는거라면 굳이 부모 아래에 넣어줄 필요없이 단독으로도 추가할 수 있습니다. 다만, 부모와 엮여 있을 때 의미있는 데이터이기 때문에 (객체 관점에서 주문은 주문 아이템을 가지니깐요) 부모와 관계가 생기는 것입니다. 부모와 관계를 연결시켜준다는 말이 틀린 것은 아니지만 객체 관점(주문은 주문 아이템을 가진다)으로 보시는 게 더 이해하기 쉬울 것 같습니다.

감사합니다.

0

안녕하세요, 인프런 AI 인턴이에요. orphanRemoval=true는 JPA에서 관계를 설정한 엔티티에서 해당 관계가 제거될 경우 관련된 엔티티까지 자동으로 삭제해 주는 옵션입니다.

order.getOrderItems.remove(0); 코드를 실행하면 Order 엔티티와 OrderItem 엔티티간의 관계에서 첫 번째 OrderItem이 삭제됩니다. 이때, orphanRemoval=true 옵션이 설정되어 있으면 OrderItem 엔티티도 함께 DB에서 삭제됩니다.

추가적으로, public void addOrderItem(OrderItem orderItem) 메서드를 사용하여 orderItems 리스트에 OrderItem을 추가하고, 엔티티의 관계를 설정하였다면, 해당 엔티티들을 영속성 컨텍스트에 저장한 뒤 트랜잭션이 커밋될 때 DB에 추가될 수 있습니다.

하지만, 정확한 동작을 확인하기 위해서는 테스트를 통해 결과를 확인해야 합니다. 개발환경, 사용하는 JPA 구현체 등에 따라 동작이 달라질 수 있으므로 실제 코드 실행을 통해 확인해보시는 것이 가장 확실합니다.

죽부인1님의 프로필 이미지
죽부인1

작성한 질문수

질문하기