Blog

[Spring][258] 트러블슈팅: JPA 연관 관계와 삭제 동작 문제

Author
Summary
Category
Project
Tags
Project
Favorite
Memory Date
2023/10/18
Cross Reference Study
Related Media
Related Thought
Related Lessons
tag
트러블슈팅
날짜
작성자
진행상황
진행 전
태그구분
6 more properties

문제 상황

•
BookDonationEvent를 삭제할 때 연결된 Book까지 함께 삭제된다.
•
orphanRemoval = true 설정 때문에, 연관 관계가 끊어진 Book 엔터티가 데이터베이스에서 자동 삭제된다.

원인 파악

•
JPA의 orphanRemoval = true 설정은, 부모 엔터티에서 자식 엔터티의 참조가 제거될 때, 해당 자식 엔터티도 데이터베이스에서 삭제된다.
•
deleteDonationEvent 메소드에서 연관관계를 끊는 동작(removeBook)을 하면서 Book 엔터티가 데이터베이스에서 삭제되었다..

해결 방안

•
CascadeType.REMOVE를 이용해서 해결 한다. 부모 엔터티가 삭제될 때, 연관된 자식 엔터티도 함께 삭제할 것인가를 결정한다.
•
연관 관계를 먼저 끊고, 그 후 BookDonationEvent를 삭제한다.

해결

/** * 양방향 */ @OneToMany(fetch = FetchType.LAZY, mappedBy = "bookDonationEvent", cascade = CascadeType.REMOVE) private List<Book> books = new ArrayList<>();
Java
복사
이처럼 양방향으로 설정한 이후 케스케이드를 사용해서 둘다 삭제해야할때는 그냥 삭제 하나만 삭제 해야 할때는 연관관계를 해제하고 삭제한다.
/** * 연관 관계 삭제 * 도서와 나눔 이벤트 간의 연관 관계 삭제 */ int bookSize = bookDonationEvent.getBooks().size(); for (int i = bookSize - 1; i >= 0; i--) { bookDonationEvent.getBooks().get(i).changeStatus(BookStatusEnum.POSSIBLE); bookDonationEvent.removeBook(bookDonationEvent.getBooks().get(i)); }
Java
복사