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

반응형

문제

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

 

'null id in entry (don't flush the Session after an exception occurs)'

 

저장을 시도 했던 엔티티가 저장 하는 과정에서 에러가 발생 했고, 저장에 실패한 엔티티가 id 가 null 인 채로 준영속상태로 세션에 남아있는다. 그리고 마지막에 엔티티매니저가 Flush 되는 순간에 준영속상태로 남아있는 엔티티를 다시 저장을 시도할 때 id 가 null 이기 때문에 발생하는 에러다. 

 

해결

hibernate 는 save() 에 실패 했다고 해서 세션을 비워 주지 않는다. 그래서 저장 실패한 엔티티가 세션에 남아서 에러를 발생시킨 것이다. 그렇기 때문에  entityManager.clear() 를 호출해 세션을 비워 주면 해결이 된다.

try{
	// 저장 실패
	memberRepository.save(member);
}catch(Exception e){
	// 실패할 경우 세션 초기화
	entityManager.clear();
}

 

반응형