flush
는 영속성 컨텍스트의 변경 내용을 DB와 동기화한다.
em.flush()
를 직접 호출엔티티 매니저에서 직접 em.flush()
를 호출해서 영속성 컨텍스트를 flush
한다.
트랜젝션이 종료될 때, 변경 사항을 SQL로 전달해야 한다.
따라서, flush
를 통해서 내부의 SQL 저장소의 쿼리들을 DB에 반영한다.
// A,B,C를 영속성 컨텍스트에 영속시킨다.
em.persist(A);
em.persist(B);
em.persist(C);
// 아직 DB에 반영되지않았다.
// 중간에 JPQL 실행
query = em.createQuery("select M from Member m", Member.class);
List<Member> members = query.getResultList();
// 결과에 A,B,C가 포함된다.
JPQL은 SQL로 변환되어 DB에서 조회된다.
하지만, A,B,C는 아직 DB에 반영이 되지 않은 상태다.
따라서 JPQL 실행 전, flush
를 통해서 영속성 컨텍스트와 DB를 동기화 시킨 후 조회한다.
flush()
옵션FlushModeType.Auto
: 커밋이나 쿼리를 실행할 때 (기본)
FlushModeType.Commit
: 커밋을 실행할 때