배치 쿼리를 실행하면 영속성 컨텍스트 안의 값과 DB 안의 값이 일치하지 않는 상황이 발생할 수 있다.
따라서 영속성 컨텍스트 값이 DB 값과 일치할 수 있도록
em.flush();
em.clear();
를 함께 사용해 영속성 컨텍스트를 초기화 해야 한다.
// 변경 내용을 데이터베이스에 동기화
em.flush();
// 영속성 컨텍스트 초기화
em.clear();
em.flush()
영속성 컨텍스트 내에서 변경된 내용이 데이터베이스로 동기화된다.
그러나 이후에 다시 쿼리를 실행할 때 영속성 컨텍스트 내에 남아있는 엔티티들은 여전히 이전 상태를 가지고 있을 수 있으므로 em.clear()
를 함께 사용해야 한다.
em.clear()
영속성 컨텍스트의 모든 엔티티와 관련된 상태가 초기화된다. 따라서 영속성 컨텍스트에 남아있는 엔티티들은 모두 분리(detached) 상태가 된다.
이후에 새로 엔티티를 로드하거나 변경 내용을 데이터베이스에서 다시 가져올 때 영속성 컨텍스트가 새로운 상태로 초기화되기 때문에, 데이터베이스와 일치하는 값을 가져올 수 있다.