양방향 연관 관계에서 한 쪽만 삭제 시 문제 해결

song yuheon·2023년 10월 13일
0

Trouble Shooting

목록 보기
29/57
post-thumbnail
post-custom-banner

문제



양방향 연관 관계가 설정된 두 엔터티 간에 한 쪽 엔터티만 삭제하려 할 때 데이터베이스 제약 조건 위반 오류 발생한다.


문제 원인 파악


비즈니스 로직

    @Transactional
    public ResponseEntity<MessageDto> deleteBookApplyDonation(Long applyId, BookApplyDonationRequestDto bookApplyDonationRequestDto) {
        BookApplyDonation bookApplyDonation = bookApplyDonationRepository.findById(applyId)
                .orElseThrow(()->new IllegalArgumentException("해당 신청이 존재하지 않습니다."));

        /**
         * 책나눔 신청 취소
         */
        bookApplyDonationRepository.delete(bookApplyDonation);

        return ResponseEntity.ok().body(new MessageDto("책 나눔 신청이 취소되었습니다."));
    }

book

    @OneToOne(fetch = FetchType.LAZY,orphanRemoval = true)
    @JoinColumn(name="apply_id")
    private BookApplyDonation bookApplyDonation;

bookApplyDonation

  /**
     * orpanremoval 삭제
     * 도서 나눔 신청 취소할 시 도서 삭제되는 문제 발생
     */
    @OneToOne(fetch = FetchType.LAZY, mappedBy = "bookApplyDonation")
    private Book book;

  • 양방향 연관 관계에서 한 쪽 엔터티만 삭제하려 할 때 연관된 다른 엔터티와의 관계가 여전히 존재하기 때문에 데이터베이스 외래키 제약 조건이 위반될 수 있다.

해결 순서


  1. 연관 관계 해제
    삭제하기 전에 연관된 두 엔터티 간의 관계를 먼저 해제한다.

     // book
     public void removeBookApplyDonation(){
         this.bookApplyDonation = null;
     }
    // service Logic
    bookApplyDonation.getBook().removeBookApplyDonation();
  2. 삭제 수행
    연관 관계가 해제된 후에 원하는 엔터티를 삭제한다.

    entityManager.remove(a);
  1. 데이터베이스 외래키 설정 확인
    외래키에 설정된 옵션 (CASCADE, OrphanRemoval)에 따라 다른 엔터티에 영향이 가는지 확인한다.

  2. 비즈니스 로직 확인
    연관 관계 해제 시 필요한 추가 처리 로직이 있는지 확인하고 필요하면 적용한다.

  3. 트랜잭션 관리
    연관 관계 해제와 엔터티 삭제 작업을 동일한 트랜잭션 범위 내에서 처리한다.


profile
backend_Devloper
post-custom-banner

0개의 댓글