Cascade Delete설정

딸모붕·2023년 11월 11일
post-thumbnail

현재 알고리즘 출제 사이트를 구현 중이다.
???: 질문 게시판 삭제가 안돼요
해결했습니다
.
.

???: 질문 게시판이 계속 다 지워져요


질문 게시글은 알고리즘 문제를 참조한다.

그림처럼 Question 테이블에서 Challenge의 challenge_id를 fk키로 가진다.
Question테이블을 생성할 때 제약 조건을 설정해주지 않아서 처음에 삭제가 정상적으로 되지 않아 제약 조건을 설정해주었다.

MYSQL에서 설정


On Delete를 CASCADE로 설정해 알고리즘 문제가 삭제되면 질문 게시글도 모두 삭제될 수 있도록 설정했다.


코드에 제약 조건 추가(문제 발생)

빨리 수정해서 프론트분한테 전달해야겠다는 마음만 앞서서 구글링한 내용을 제대로 읽어보지도 않고 아래 내용을 내 코드에 적용했다

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "challenge_id")
private Challenge challengeId;

JPA에서 cascadeType를 정의하는 것은 관련 엔티티로 전파되는 cascade 가능 작업들을 정의하는 것이다.
내가 설정한 CascadeType.ALL은 모든 cascadeType(create, update, delete, and refresh)이 적용된다.

이것때문에 question을 삭제했을 때 연관된 엔티티인 challenge까지 삭제되었고 위에서 db에 설정해준 onDelete설정때문에 다른 question까지도 모두 삭제된 것이다.

해결 with @OnDelete

JPA에서 db에 설정한 것과 같은 cascade 제약조건을 설정해주려면 @OnDelete를 사용하면 된다

  @ManyToOne
  @JoinColumn(name = "challenge_id")
  @OnDelete(action = OnDeleteAction.CASCADE)
  private Challenge challengeId;

hibernate-@OnDelete


JPA의 CascadeType은 참조 무결성을 위반할 수 있기 때문에 매우 유의해서 사용해야한다.

정확하게 알고 내 코드에 사용하자

0개의 댓글