양방향 연관 관계가 설정된 두 엔터티 간에 한 쪽 엔터티만 삭제하려 할 때 데이터베이스 제약 조건 위반 오류 발생한다.
@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("책 나눔 신청이 취소되었습니다."));
}
@OneToOne(fetch = FetchType.LAZY,orphanRemoval = true)
@JoinColumn(name="apply_id")
private BookApplyDonation bookApplyDonation;
/**
* orpanremoval 삭제
* 도서 나눔 신청 취소할 시 도서 삭제되는 문제 발생
*/
@OneToOne(fetch = FetchType.LAZY, mappedBy = "bookApplyDonation")
private Book book;
연관 관계 해제
삭제하기 전에 연관된 두 엔터티 간의 관계를 먼저 해제한다.
// book
public void removeBookApplyDonation(){
this.bookApplyDonation = null;
}
// service Logic
bookApplyDonation.getBook().removeBookApplyDonation();
삭제 수행
연관 관계가 해제된 후에 원하는 엔터티를 삭제한다.
entityManager.remove(a);
데이터베이스 외래키 설정 확인
외래키에 설정된 옵션 (CASCADE
, OrphanRemoval
)에 따라 다른 엔터티에 영향이 가는지 확인한다.
비즈니스 로직 확인
연관 관계 해제 시 필요한 추가 처리 로직이 있는지 확인하고 필요하면 적용한다.
트랜잭션 관리
연관 관계 해제와 엔터티 삭제 작업을 동일한 트랜잭션 범위 내에서 처리한다.