cascade와 orphan removal이 헷갈려요 ㅜㅜ
367
작성한 질문수 59
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
안녕하세요. Jaesang Yoon님, 공식 서포터즈 y2coder입니다.
AI 답변을 참고해주시고, 추가로 궁금한 사항은 제 댓글의 답글 혹은 질문을 새로 남겨주세요 🙂
특히 답변 링크들도 주의깊게 봐주시면 감사하겠습니다!
감사합니다.
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의 작동 방식을 직접 체험해보시기 바랍니다. 이를 통해 각 옵션의 차이점과 사용 상황에 대한 이해도가 높아지실 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
inheritance startegy 선택시 고려사항
0
11
0
Entity 동등성 비교
0
14
1
실무 조언 관련 질문입니다.
0
41
1
H2데이터베이스 파일 생성
0
52
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
49
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
48
1
JPQL 메소드와 락
0
53
1
Delivery @OneToOne
0
57
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
89
2
UnsupportedOperationException 발생
0
82
3
H2 Database 연결이 안됩니다.
0
89
2
연관관계 매핑 질문드립니다.
0
82
2
h2데이터베이스 실행오류
0
105
2
persistence.xml
0
103
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
77
1
영속성 컨텍스트
0
62
1
JPA 프록시
0
90
1
Native Query와 MyBatis
0
63
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
84
1
임베디드 타입 예시 코드 관련 질문
0
112
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
91
3
인텔리제이 패키지 커서 단축키 질문
0
106
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
137
1
양방향 연관관계 시 연관관계 주인을 설정하는 이유
0
68
1





