Java/Spring

[Spring] org.hibernate.AssertionFailure: null id in entry (don't flush the Session after an exception occurs)

SeungbeomKim 2024. 9. 4. 18:13
(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 

 

DataIntegrityViolationException에 대해서

짧은 근황을 먼저 얘기하자면...올해 3월부터 이직을 하게되어 삼쩜삼(자비스앤빌런즈) 백엔드 엔지니어로 현재 이직하여 회사를 다니고 있다.나중에 다른 포스팅으로 해당 부분은 잘 작성해보

lsj8367.tistory.com

https://juneyr.dev/hibernate-exception-does-not-flush

 

hibernate exception이 발생하면 알아서 clear 해주지 않는다

서론 null id in entry (don't flush the Session after an exception occurs…

juneyr.dev

https://mokggang.tistory.com/74

 

[TroubleShooting/JPA] null id in entry (don't flush the Session after an exception occurs)

문제 프로젝트를 진행하는 중에 엔티티 저장하는 과정들을 try {} 로 감싼 후 에러가 발생하면 다른 특별한 조치 프로세스를 취해야 했다. 에러가 발생 했을 경우에 의도한대로 동작하지 않고,

mokggang.tistory.com