BackEnd/Spring

[SpringBoot] JPA 외래키 제약 조건 해제(with. SQLIntegrityConstraintViolationException)

PgmJUN 2021. 12. 31. 00:48

 

 

 

DB를 통해 데이터를 관리하다보면 가끔 '외래키 제약조건'을 풀어주어야 하는 상황이 발생한다.

 

나같은 경우는 00시마다 PARK_DATA 테이블을 delete from 으로 초기화 시켜야하는데

연관되어 있는 외래키 때문에 아래와 같은 오류가 발생해 골치아팠다.

 

SQLIntegrityConstraintViolationException 예외 발생

 

이를 해결하기 위해선 EntityManager 의 createNativeQuery 함수를 사용해야한다.

 

 

NativeQuery란?

다양한 이유로 JPQL을 사용할 수 없을 때,

JPA에서 NativeQuery를 통해 SQL을 직접 사용할 수 있는 기능을 제공.

 

 

SQL 구문인 SET FOREIGN_KEY_CHECKS = 0 을 사용하면 외래키 체크 설정을 해제할 수 있지만

JPQL에서 이와 같은 기능을 하는 문법은 찾을 수가 없었기에 굉장히 애먹었다.

 

그래서 JPQL이 아닌 Native SQL을 직접 사용해 문제를 해결하기 위해

createQuery가 아닌 createNativeQuery를 사용하게 되었다.

 

사용법은 간단하다.

 

em.createNativeQuery("SET FOREIGN_KEY_CHECKS = 0").executeUpdate();

사용할 query

em.createNativeQuery("SET FOREIGN_KEY_CHECKS = 1").executeUpdate();

 

 

이런 식으로 사용하면 잠시동안 외래키 체크 설정을 해제하고 문법을 수행할 수 있다.

 

외래키를 무시하는 것이기 때문에 자주 사용해서는 좋지 않고

필요한 기능을 수행했다면 위와 같이 값을 다시 1로 바꾸어 원래 설정으로 돌려놓아야한다.