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

화이님의 프로필 이미지
화이

작성한 질문수

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

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

왜 flush와 clear를 안하면 자식이 삭제가 안될까요??

작성

·

395

1

orphanRemoval=true를 적용하고 em.flush / clear를 호출 안하면 왜 자식이 삭제가 안되는 걸까요??

기본키 전략이 IDENTITY 이서 em.persist 하면 자동으로 INSERT SQL이 나가는데 계속 em.flush / clear 를 하고 자식을 삭제해야만 DELETE SQL이 나가더라고요.

답변 2

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 화이님

orphanRemoval 같은 기능이 동작하려면 JPA의 기능을 완전히 지원 받아야 합니다.

그런데 em.clear()를 호출하지 않으면 아직까지는 내가 직접 만든 객체가 영속성 컨텍스트에 존재하게 됩니다.

이 경우 orphanRemoval이 지원되지 않습니다. 이 부분은 하이버네이트 구현체의 한계라고 생각하시면 됩니다.

em.clear()를 호출하고 다시 조회하게 되면 orphanRemoval이 온전하게 지원되는 객체를 JPA로 부터 받게 됩니다. 이것은 내가 만든 객체가 아니라 JPA가 완전히 새로 만든 객체입니다. 그래서 해당 기능이 잘 수행됩니다.

그런데 일반적으로 데이터를 완전히 저장하고, 그 다음에 다른 곳에서 데이터를 삭제하기 때문에 이런 문제가 실무에서는 발생하지 않습니다.

감사합니다.

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 화이님

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

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

https://drive.google.com/file/d/1mBt7dGRJylJ5VaW6F8I210v7Rk73P-vp/view?usp=sharing

1. 실행 방법을 알려주세요.

App.java main 메서드 실행하면 됩니다.

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

현재 em.flush/clear 메서드가 주석처리하고 실행하면

list에서 자식 객체를 삭제해도 delete문이 나가지 않지만 em.flush/clear 메서드 주석을 해제하면 정상적으로 delete문이 나갑니다.

화이님의 프로필 이미지
화이

작성한 질문수

질문하기