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

song yuheon·2023년 10월 18일
0

Trouble Shooting

목록 보기
31/57
post-custom-banner


문제 상황


  • 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));
        }

profile
backend_Devloper
post-custom-banner

0개의 댓글