문제 상황
•
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
복사