-
[JPA] Referential integrity constraint violation개발 지식/JPA 2023. 11. 29. 22:56
- 현재 member가 삭제되면 해당 member의 post들도 삭제가 될 수 있게 CascadeType.REMOVE를 적용해둔 상태이다.
- 해당 코드에서 em.flush() 코드를 제거하면 정상작동하는데 delete 쿼리를 확인하고 싶어서 추가하였을 때 Referential integrity constraint violation 에러가 발생하였다.
- 참조 무결성 제약 조건이란 참조할 수 없는 외래키 값을 가질 수 없다는 조건이다. 즉, member를 삭제하였더니 post가 참조하고 있는 member가 참조할 수 없는 상황이 되어서 발생한 것 같다.
- 혹시 영속성 전이가 일어나지 않은 것 아닐까 하는 생각에 post1이 영속성 컨텍스트에 있는지 확인해봤다.
System.out.println(em.getEntityManager().contains(post1)); //true
- post1이 아직 영속성 컨텍스트에 있어서 삭제된 member를 참조할 수 없기에 해당 에러가 발생한 것이었다.(flush를 하지 않으면 db에 반영되지 않고 트랜잭션 안에서 바로 rollback 되기 때문에 에러가 발생하지 않는 것이다.)
- 해당 에러를 해결하기 위해서는 영속성 전이가 정상 작동하게 코드를 수정해야 하는데 크게 두 가지 방법이 있다. 하나는 연관관계를 양쪽 세팅하고 persist 후에 remove를 하는 방법이고 다른 방법으로는 연관관계 주인부분만 세팅을 한 뒤 영속성 컨텍스트를 비운 뒤 db에서 member를 가져와서 remove 하는 방법이 있다.
결론
영속성 전이를 정확하게 동작하게 하려면 되도록 연관관계를 양쪽 모두 세팅해주자
참고 자료
https://hungseong.tistory.com/59
Entity 삭제 시 JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation 오류 발생
Spring을 통해 장소와 해당 장소에 대한 이벤트를 CRUD하는 API를 설계하던 중 발생한 문제이다. Entity 연관관계 구성 Place Entity와 Event Entity가 1:N 양방향 연관관계로 구성되어 있다. Entity 설계 - Place @
hungseong.tistory.com
'개발 지식 > JPA' 카테고리의 다른 글
[JPA] 영속성 전이(CASCADE)와 고아 객체 정리 (0) 2023.11.30 [JPA] em.merge(entity)는 내부 코드 들여다보기 (0) 2023.11.29 [JPA] JpaRepository 관련 코드 들여다보기 (0) 2023.11.28 [JPA] Entity 클래스의 @NoArgsConstructor(access = AccessLevel.PROTECTED) (0) 2023.11.07