@Entity
public class Parents {
@Id
@Column(name="PARENTS_ID")
private Long id;
@OneToMany(mappedBy = "parents", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private List<Child> childList = new ArrayList<>();
}
@Entity
public class Child {
@Id
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "PARENTS_ID")
private Parents parents;
}
간단하게 위와 같은 엔티티가 있다.
현재 부모를 삭제하는 코드를 작성하는 상황이다. 부모가 삭제되면 자식도 삭제되어야 하기에
for(Child child : parents.getChildList()){
childRepository.delete(child);
}
parentsRepository.delete(parents);
이렇게 반복문을 돌며 자식을 모두 삭제한 후 부모를 삭제하려고 한다.
하지만 부모만 삭제될 뿐, 자식은 삭제되지 않는다. 이유가 뭘까?
양방향 관계가 맺어진 경우 부모객체에게서 삭제할 대상 객체가 삭제되어야한다.
나는 for문을 모두 돌아 child를 삭제한 후 parents.getChildList().clear()를 해줄 생각이었으나, 자식 객체를 delete하기 전에 부모객체에게서 자식객체를 삭제해 관계를 끊어줄 필요가 있었다.
* 이 프로젝트에서는 중요한 데이터를 삭제할 때 기록을 남기기 위해 soft delete 정책을 사용한다. 하지만 단순한 데이터는 삭제되더라도 굳이 남겨둘 필요가 없어 delete를 하고 있다. 여기서 Parents는 soft delete를 활용하고 Child는 DELETE를 날리고 있었다. 하지만 위 문제는 이런 부분과 상관이 없는 듯하다.
* Parents가 soft delete를 사용하고 있다면 cascade는 작동하지 않는다. 즉 Parents를 삭제한다고 해서 Child가 함께 삭제되지 않는다. 위 코드와 같이 작성한 이유도 이 때문이었다.
* cascade 옵션을 사용하지 않으면 parents.getChildList().remove(child)를 먼저 해주지 않아도 child.delete가 동작한다. cascade 와 양방향 연관관계에 대해서는 조금 더 공부해야봐야겠다.
참고
이 포스팅에서 말하는 내용이 찾던 것과 다르다면 아래 링크를 확인해보길 권한다. 관련된 여러 상황에 대해 이야기 하고 있다.
https://stackoverflow.com/questions/22688402/delete-not-working-with-jparepository
'Tips > Errors' 카테고리의 다른 글
Caused by: java.lang.reflect.InaccessibleObjectException (0) | 2023.02.16 |
---|---|
Gradle multi project 특정 dependency 제외 안 됨 (1) | 2022.03.14 |
[STS][eclipse] SpringBoot에 ansi콘솔로 인한 렉/ 콘솔 렉 (0) | 2021.07.30 |
[svelte template clone][ 'degit@latest' ] 설치가 오류 코드 7로 실패했습니다 (0) | 2021.07.27 |
오라클 디벨로퍼 실행 안 될 때. 안 켜질 때. (1) | 2020.12.11 |