(conn=65) Duplicate entry '13-11.1.1.81' for key 'device_id_ip_UNIQUE'
org.hibernate.AssertionFailure: null id in com.piolink.cc.app.ndm.domain.Host entry (don't flush the Session after an exception occurs)
해당 에러가 어떠한 에러인지 간략하게 설명드리겠습니다.
try ~ catch 문에서 save 과정을 거칠 때, unique key 제약 조건을 위반하여 첫 번째로 Hibernate Exception인 DataIntegrityViolationException이 발생하게 됩니다.
이후 JPA Save가 실패하면서 세션이 초기화되어야 하지만, Hibernate Exception이 터졌다고 세션을 초기화해주지 않습니다. JPA Detached 상태에서 flush가 발생할 때 Entity의 id 값이 null로 남아있어서 발생하는 예외입니다.
예외 발생 순서
- DataIntegrityViolationException에 발생한 예외를 처리하지 못해 AssertionFailure 예외가 궁극적으로 발생하게 됩니다.
해결 방안은 try ~ catch 문에서 예외를 잡아줄 때, 세션을 초기화 (entitymanager.clear()) 해주면 됩니다.
세션을 초기화하면, Save 시점에서 Detached 상태인 Entity가 없어지기에 해당 예외를 방지할 수 있게 됩니다.
<참고 자료>
https://lsj8367.tistory.com/m/entry/DataIntegrityViolationException
https://juneyr.dev/hibernate-exception-does-not-flush
https://mokggang.tistory.com/74
'Java > Spring' 카테고리의 다른 글
[Spring] @Transactional isolation level, propagation level, timeout (5) | 2024.09.23 |
---|---|
[Spring] Spring Security 동작 원리 파악 (id, pw 기반의 basic auth 방식) (0) | 2024.09.06 |
[Spring] Spring Batch Architecture & Component (0) | 2024.07.05 |
[Spring] Ajax 통신에서 Csrf Header, Token 정보를 넘겨주는 방법 (0) | 2024.05.29 |
[Java] ProcessBuilder (1) | 2024.04.02 |