작성
·
569
·
수정됨
4
안녕하세요 영한님!
질문드립니다.
고아 객체는 부모 엔티티와 연관관계가 끊어진 자식 엔티티 라고 이해했습니다.
고아 객체가 생성되는 조건은
부모 엔티티 삭제
부모 엔티티가 삭제 되면 자식 엔티티를 고아객체로 판단 합니다.
e.g) em.remove(parent);
부모 엔티티에 있는 자식 엔티티 컬렉션 제거
연관관계가 끊어진 자식 객체를 고아객체로 판단 합니다.
e.g) parent.getChild().remove(0);
결과적으로 orphanRemoval = true
를 설정하면
자식 엔티티(고아 객체)는 부모 엔티티와 함께 삭제 되거나
자식 엔티티(고아 객체)만 삭제 된다.
맞게 이해하고 있는 것 일까요?
감사합니다.^^
답변 1
답변 감사의 말씀 드립니다. 영한님^^!
제가 테스트 한 내용을 공유 드립니다.
테스트 결과 공유 드립니다.!
테스트 결과 고아객체 생성 조건은 다음과 같이 2가지 입니다.
부모 엔티티 삭제
부모 엔티티가 삭제 되면 자식 엔티티를 고아객체로 판단 합니다.
e.g)
em.remove(parent);
부모 엔티티에 있는 자식 엔티티 컬렉션 제거
연관관계가 끊어진 자식 객체를 고아객체로 판단 합니다.
e.g)
parent.getChild().remove(0);
제가 이해하고 있는 것이 맞았습니다!🤗
orphanRemoval = true를 설정 🙆♂️
File
Post
실험 <부모 엔티티 삭제(
em.remove(parent);
)>결과
부모 엔티티를 삭제하면(
em.remove(findPost);
) 자식 엔티티가 먼저 삭제되고, 부모 엔티티가 삭제되는 것을 확인할 수 있습니다.마치
CascadeType.REMOVE
처럼 동작 합니다.!!!실험 <부모 엔티티에 있는 자식 엔티티 컬렉션 제거(
parent.getChild().remove(0);
)>결과
부모 엔티티와 자식 엔티티의 연관관계가 끊어지니 자식 엔티티에 대한
delete SQL
이 발생 했습니다.!!이때
orphanRemoval
을 적용하기 위해서는CascadeType.PERSIST
를 포함시켜야합니다.https://www.inflearn.com/questions/137740/orphanremoval%EA%B3%BC-cascade%EC%9D%98-%EA%B4%80%EA%B3%84
orphanRemoval = true를 설정 🙅♂️
File
Post
실험
결과
지연로딩으로 설정했기 때문에
findPost.getFiles().remove(0);
시점에서select * from File ... SQL
이 발생합니다.그리고
orphanRemoval
를 따로 설정하지 않아서 부모 엔티티와 자식 엔티티의 연관관계가 끊어졌음에도delete SQL
이 발생하지 않았습니다.!감사합니다.^^