TroubleShooting

JPA delete 후 insert가 안될 때(duplicate entry error)

KJihun 2023. 9. 3. 12:07
728x90
 

 

 

문제

우선 user와 userImage가 OneToOne 관계를 가지고 있었다.
user의 이미지 수정 요청 시, delete 후 insert 하기 위해 코드를 구현하는 와중에 duplicate entry error가 발생했다.
unique 조건이 있는 데이터인데 삭제가 되지 않은 채로 추가를 하려 해서 발생하는 에러였다.

로그를 확인해도 delete코드가 먼저 적혀있음에도 불구하고 insert를 먼저 실행하는 것을 확인할 수 있다.

찾아보니 hibernate에서 동작하는 SQL 순서가 정해져 있었다.

 

참조 블로그: https://eocoding.tistory.com/74

 

 


 

시도

 

entityManager의 flush 메서드를 사용하여 손쉽게 영속성 컨텍스트의 변경내용(delete)을 DB에 동기화할 수 있었다.

참조 블로그: https://eocoding.tistory.com/74

하지만 하나의 요청을 위해 entityManager를 호출하는 것은 비효율적 이라고 생각했다.

더욱 효율적인 방법이 없을까 고민하고 찾아보다가 좀 더 효율적으로 해결할 수 있었다.

 

 


 

해결

 

 

그래서 선택한 방법은 delete 구문에 Modifying 어노테이션을 사용하여 삭제가 진행됨과 동시에

flush를 auto로 설정하여 영속성 컨텍스트의 변경내용(delete)을 DB에 즉시 동기화 하고,

clear를 auto로 설정하여 DB와 영속성 컨텍스트의 동일성을 보장할 수 있도록 했다.

 


 

알게된 것

JPA의 동작 순서를 알게 되었으며, 같은 예외가 발생하더라도 충분히 대응할 수 있을 것 같다.