Blog

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

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

문제

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

문제 원인 파악

비즈니스 로직

@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("책 나눔 신청이 취소되었습니다.")); }
Java
복사

book

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

bookApplyDonation

/** * orpanremoval 삭제 * 도서 나눔 신청 취소할 시 도서 삭제되는 문제 발생 */ @OneToOne(fetch = FetchType.LAZY, mappedBy = "bookApplyDonation") private Book book;
Java
복사
양방향 연관 관계에서 한 쪽 엔터티만 삭제하려 할 때 연관된 다른 엔터티와의 관계가 여전히 존재하기 때문에 데이터베이스 외래키 제약 조건이 위반될 수 있다.

해결 순서

1.
연관 관계 해제 삭제하기 전에 연관된 두 엔터티 간의 관계를 먼저 해제한다.
// book public void removeBookApplyDonation(){ this.bookApplyDonation = null; } // service Logic
Java
복사
bookApplyDonation.getBook().removeBookApplyDonation();
2. **삭제 수행** 연관 관계가 해제된 후에 원하는 엔터티를 삭제한다. ```java entityManager.remove(a);
Plain Text
복사
1.
데이터베이스 외래키 설정 확인 외래키에 설정된 옵션 (CASCADE, OrphanRemoval)에 따라 다른 엔터티에 영향이 가는지 확인한다.
2.
비즈니스 로직 확인 연관 관계 해제 시 필요한 추가 처리 로직이 있는지 확인하고 필요하면 적용한다.
3.
트랜잭션 관리 연관 관계 해제와 엔터티 삭제 작업을 동일한 트랜잭션 범위 내에서 처리한다.