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

조현화님의 프로필 이미지

작성한 질문수

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

영속성 전이(CASCADE)와 고아 객체

CascadeType.ALL + orphanRemovel = true 와 그냥 CascadeType.ALL만 썼을 때의 차이

해결된 질문

작성

·

440

1

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

안녕하세요.

영한님의 강의를 모두사서.. 탐독하는 주니어 개발자 입니다 ㅎㅎ..

 

21:37 부분에 영속성 전이 + 고아 객체, 생명주기 파트에서 이해가 가지 않는 부분이 있어서요.

 

위에서 명시해놓으시기를 CascadeType.ALL + orpahanRemover=true 두 옵션을 모두 활성화 하면 부모 엔티티를 통해서 자식의 생명주기를 관리할 수 있음 이라고 명시되어있습니다.

 

제가 궁금한부분은 CascadeType.ALL 자체가 CascadeType.ALL + orpahanRemove=true 를 이미 모두 포함하고 있다는 생각이 드는데요..

  1. CascadeType.All 만 설정

  2. CascadeType.All + orpahanRemove=true 모두 설정

두 가지의 차이가 있나요?

답변 1

4

조현화님의 프로필 이미지
조현화
질문자

자문자답..

많이 생각하고 고민하면, 답이 도출되네요..

시나리오 2가지를 가정해서 테스트 해보았습니다.

 

  1. CascadeType.All 만 설정

    • 해당 경우 부모 객체를 삭제하는 경우, 자식 객체까지 모두 삭제됨

    • findParent.getChildList().remove(0) 의 경우 단순히 parent의 리스트에서 제거한 경우이기 때문에 고아객체가 되더라도 orphanRemove 설정이 없기때문에 DB에서 삭제되지 않고 DB속 FK키도 유지

 

  1. CascadeType.All + orphanRemove=true 모두 설정 시

    • 당연히, 부모 객체를 삭제하는 경우, 자식 객체까지 모두 삭제됨

    • findParent.getChildList().remove(0) 의 경우 orphanRemove = true 설정으로인해 객체가 고아가 됨을 감지할 시 parent의 리스트에 삭제됨과 함께 DB에도 삭제

 

정도로 정리가 되는거 같습니다.!

안녕하세요. 조현화님, 공식 서포터즈 y2gcoder입니다.

잘 정리하신 것 같습니다.
파이팅입니다!

감사합니다.