[Error:Spring Data JPA]Cannot delete or update a parent row: a foreign key constraint fails 해결

god1hyuk·2022년 8월 9일
1

Trouble Shooting

목록 보기
3/6

"게시물 좋아요" 기능과 관련하여 Entity들의 연관관계 매핑 후 CRUD 코드작성이 모두 완료 되었다.

Post.java (Parent Entity)

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Like> likes;

Like.java (Child Entity)

// 대표적으로 Post만 명시 (나머지 참조객체도 동일한 형태)
@JoinColumn(name = "post_id")
@ManyToOne(fetch = FetchType.LAZY)
private Post post;

그러나 수정, 삭제 기능에서 작동이 되지 않는 것이다. IntelliJ로 돌아가 콘솔을 보니

o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1451, SQLState: 23000
o.h.engine.jdbc.spi.SqlExceptionHelper   : Cannot delete or update a parent row: a foreign key constraint fails ...

이러한 에러가 발생하였다.
에러 내용을 해석해보니 FK의 제약 조건이 실패 했고 그래서 parent row을 삭제하거나 수정할 수 없다는 내용이었다.

그런데 분명, cascade 속성과 orphanRemoval 속성(Parent Entity가 삭제 되었을 때, Child Entity도 함께 삭제 시켜주는 역할)까지 적용 시켜주었는데 안되는게 처음엔 감이 오질 않았다.


나는 가장 중요한 포인트를 놓치고 있었다.
Entity들의 연관관계에서 누가 주도권을 쥐고 있는지, 즉 어떤 Entity가 Parent Entity인지 명시를 하지 않았던 것이다.

1:N(일대다), N:1(다대일)의 상황이라면 당연 1인 쪽이 주인이 아닌가 생각할 수도 있겠지만, 겨우 그것 가지고는 충분치 않다.

반드시, 연관관계의 주인을 명시해주어야 한다.

해결방법은 이러하다.

Post.java

@OneToMany(mappedBy = "post", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private List<Like> likes;

mappedBy = "post"

이렇게 @OneToMany 어노테이션에 mappedBy 속성을 명시하여 연관관계의 주인인 것을 알려줘야 한다. post 테이블로부터 like 테이블에 매핑 시켜주겠다는 의미이다.

이로써 에러가 해결되고 게시물(Post)의 수정, 삭제가 가능해졌다.
(Post 삭제 시, Child Entity인 좋아요(Like)도 함께)

0개의 댓글