Blog

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

tag
트러블슈팅
날짜
2023/10/18
생성 일시
2023/10/28 06:39
작성자

문제 상황

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
복사