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<>();
이처럼 양방향으로 설정한 이후 케스케이드를 사용해서 둘다 삭제해야할때는 그냥 삭제
하나만 삭제 해야 할때는 연관관계를 해제하고 삭제한다.
/**
* 연관 관계 삭제
* 도서와 나눔 이벤트 간의 연관 관계 삭제
*/
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));
}