• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

cascade와 orphan removal이 헷갈려요 ㅜㅜ

24.03.29 01:06 작성 조회수 90

0

Child child1 = new Child();
Child child2 = new Child();

Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);

em.persist(parent);

em.flush();
em.clear();

Parent findParent = em.find(Parent.class, parent.getId());

// em.remove(findParent);
findParent.getChildList().remove(0);

tx.commit();
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Child> childList = new ArrayList<>();


cascade 옵션과 orphanRemoval옵션을 각각 켜보기도 하고 둘다 켜보기도 하면서,

주석 표시해 둔 em.remove와 그 아랫줄에 해당하는 코드를 번갈아 주석처리해보며 cascade와 orphan removal의 차이에 대해 알아보려고 하는데 할 수록 헷갈리네요 ㅜ

다시 한 번 정리해주실 수 있을까요? 강의를 다시 봐도 헷갈리는 지점이 있어서 질문드립니다.

 

답변 2

·

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2024.03.29

안녕하세요. Jaesang Yoon님, 공식 서포터즈 y2coder입니다. 

AI 답변을 참고해주시고, 추가로 궁금한 사항은 제 댓글의 답글 혹은 질문을 새로 남겨주세요 🙂

특히 답변 링크들도 주의깊게 봐주시면 감사하겠습니다!

감사합니다.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.03.29

안녕하세요, 인프런 AI 인턴입니다. Jaesang Yoon 님, cascade와 orphanRemoval 옵션에 대한 혼란을 해소하는데 도움을 드리겠습니다.

두 옵션의 핵심적인 차이는 다음과 같습니다:

  • cascade = CascadeType.ALL 옵션은 부모 엔티티(Parent)의 생명주기가 자식 엔티티(Child)에게도 영향을 미치게 합니다. 즉, 부모 엔티티를 저장하거나 삭제할 때 연관된 자식 엔티티들도 같이 저장되거나 삭제됩니다. 예를 들면, em.persist(parent)를 호출할 때, cascade = CascadeType.ALL 설정으로 인해 parent에 포함된 child1과 child2도 함께 영속화(persist)됩니다.

  • orphanRemoval = true 옵션은 부모 엔티티와의 연관관계가 끊어진 자식 엔티티(고아 객체)를 데이터베이스에서 자동으로 삭제합니다. 예를 들어, findParent.getChildList().remove(0);를 실행하면, 리스트에서 제거된 child1이 고아 객체가 되며, orphanRemoval 옵션이 true로 설정되어 있기 때문에, 트랜잭션을 커밋(tx.commit())할 때 데이터베이스에서도 자동으로 삭제됩니다.

Jaesang Yoon 님의 코드에서 em.remove(findParent);을 실행할 경우, cascade 옵션 덕분에 parent 엔티티를 삭제하면 연관된 child 엔티티들도 함께 삭제됩니다. 반면,findParent.getChildList().remove(0);`만 실행할 경우는 childList에서 첫 번째 자식(child1)을 제거하는 것인데, orphanRemoval 옵션이 true일 경우에만 고아 객체가 된 child1이 실제 데이터베이스에서도 삭제됩니다.

이 와 관련하여 비슷한 질문과 답변을 참조하실 수 있습니다:

  • Cascade와 OrphanRemoval 관련 질문에서 영속성 전이(CASCADE)와 고아 객체(orphanRemoval)의 차이를 정리하고 있으며, 특히 orphanRemoval에 대한 심층적인 설명이 포함되어 있습니다.

  • OrphanRemoval = true 관련 질문드립니다.에서 findParent.getChildList().remove(0);의 작용과 orphanRemoval 옵션이 true일 때의 상황에 대해 설명하고 있습니다.

  • CASCADE 속성에 대한 추가적인 설명과 예시 코드를 통해 CASCADE와 orphanRemoval 옵션의 작동 방식을 보다 자세히 이해할 수 있습니다.

반드시 강의의 관련 부분과 이 답변들을 참고하여 직접 코드를 실행해보시며, cascade와 orphanRemoval의 작동 방식을 직접 체험해보시기 바랍니다. 이를 통해 각 옵션의 차이점과 사용 상황에 대한 이해도가 높아지실 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.