강의

멘토링

커뮤니티

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

ocean blue님의 프로필 이미지
ocean blue

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

casecade와 orphanRemoval에 대한 질문

작성

·

137

0

안녕하세요?

저는 앱 개발 동아리에서 프로젝트를 진행 중인 취업준비생입니다.

개발 도중에 casecade와 orphanRemoval에 대해 헷갈리는 점이 생겨 질문하게 되었습니다.

[상황]

Post, AlcoholTag, UserRecipe라는 클래스가 있고, 연관관계는 Post : AlcoholTag = 1:N, AlcoholTag : UserRecipe = 1:N 인 상태입니다.

현재 게시글 삭제 API를 작성하던 중이었고 Post를 삭제할 경우 그와 연관된 AlcoholTag가 삭제되고, 또 그렇게 Post에 의해 삭제된 AlocholTag들 각각과 연관되어 있던 UserRecipe까지 삭제가 되는 API 입니다.

Post.java

AlcoholTag.java

UserRecipe.java

[문제]

여기서 AlcoholTag에 있는 아래 코드에서 orphanRemoval이 없이 casecade REMOVE만 적용하면

@OneToMany(mappedBy = "alcoholTag", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<UserRecipe> userRecipes = new ArrayList<>();

Post를 postRepository에서 delete로 삭제할 때 AlcoholTag들은 삭제되고 이거에 연관된 UserRecipe들은 삭제되지 않더라고요. Post에 의해 삭제되었더라도 AlcoholTag가 삭제되었다면 이 영속 상태에 따라 UserRecipe도 삭제될 거라고 생각했는데, 그렇지 않은 이유가 뭔지 알려주실 수 있을까요? 일단은 문제 해결을 위해 고아 객체를 제거하도록 orphanRemoval = true를 추가했고 정상적으로 삭제되는 걸 확인했습니다. 

질문 읽어주셔서 감사합니다! 

답변 1

1

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

안녕하세요. ocean blue님

코드만 보면 정상 수행되어야 합니다.

다시 한번 확인해보시고, 만약 그래도 문제가 있으면

 

전체 프로젝트를 압축해서 올려주세요.

감사합니다.

 

ocean blue님의 프로필 이미지
ocean blue
질문자

제가 테스트 과정에서 실수가 있었나 보네요. 시간 지나서 다시 해봤는데 되네요...!^^

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

네^^

ocean blue님의 프로필 이미지
ocean blue

작성한 질문수

질문하기