CascadeType.REMOVE vs OrphanRemoval = true

Kim Dong Kyun·2023년 1월 3일
2

Today I learned

목록 보기
27/43

개요

CascadeType.REMOVE 는 부모 엔티티가 사라졌을 때 자식 엔티티도 삭제된다. 그리고 orphanRemoval 또한 부모 엔티티와 관계가 끊어진 자식 엔티티, 즉 고아 엔티티를 삭제한다. 아니 그럼 뭐가 다른거야?

CascadeType.REMOVE

CascadeType.REMOVE는 부모 엔티티가 사라졌을 때 자식 엔티티가 자동으로 사라지지 않는다. 즉, 테이블에서 제거되지 않는다. 더하여 내가 실험한 케이스는 아래와 같다.

1. PERSIST + orphanRemoval = true

위처럼 PERSIST와 orphanRemoval을 모두 True로 했다. 그런데 뭔가가 남아있는지 포스트맨에 계속 요청을 보내도 0이라는 답변만 돌아올 뿐...무엇이 문제였는가? 다음은 H2Console을 이용한 LikesComment 테이블이다.

위처럼 분명히 deleteById를 사용해서 삭제했음에도 남아있다!

1-2 왜?

https://joont92.github.io/jpa/CascadeType-PERSIST%EB%A5%BC-%ED%95%A8%EB%B6%80%EB%A1%9C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%A9%B4-%EC%95%88%EB%90%98%EB%8A%94-%EC%9D%B4%EC%9C%A0/

위 참고링크의 예상치 못한 상황 2에 해당한다.

-> 더불어 아무리 이해하려고 해도 오늘은 이해가 안된다. 그러나 나중을 위해 키워드와 상황만을 남긴 채 종료하려고 한다.
-> 22.01.04 기준아직 답을 찾지 못했다...대체 왜지? 그러나 REMOVE와 orphanRemoval을 비교하는 글은 남긴다.

2. REMOVE + orphanRemoval = true

위와 같은 경우에 정상 작동한다.


OrphanRemoval = true vs CascadeType.REMOVE

위 두 친구들은 사용되는 방식이 다르다.

REMOVE를 사용하면 부모 객체를 삭제했을 때 자식 객체와의 연결이 끊긴다. 그러나 자식 객체는 삭제되지 않는다.

OrphanRemoval 은 연결이 끊긴 자식 객체, 즉 고아 객체를 삭제한다.


수정이 필요하다.

22.01.04 기준아직 답을 찾지 못했다...대체 왜지? 그러나 REMOVE와 orphanRemoval을 비교하는 글은 남긴다.

2개의 댓글

comment-user-thumbnail
2023년 1월 4일

키보드도 없는 양반이 어떻게...

1개의 답글