작성
·
298
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
안녕하세요, 인프런 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의 작동 방식을 직접 체험해보시기 바랍니다. 이를 통해 각 옵션의 차이점과 사용 상황에 대한 이해도가 높아지실 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.