영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
JPQL 쿼리 실행 시 플러시가 자동 호출 되는 이유
em.persist(member1);
em.persist(member2);
em.persist(member3);
// 영속 상태이고, 아직 쿼리문이 날아가지 않았다.
query = em.createQuery("select m from Member m", Member.class);
List<Member> member = query.getResultList();
// 하지만 JPQL로 member리스트를 조회했고, 위에 영속성 컨텍스트에 잇는 엔티티들이 실제로 쿼리문이 날아가지 않았기에 조회를 못하지만 JPQL 실행 시점에 자동으로 flush를 통해 영속성 컨텍스트 내에 엔티티들이 DB저장되게 되어 JPQL 쿼리 실행 시 데이터를 볼 수 있게 된다.
em.setFlushMode(FlushModeType.COMMIT);
FlushModeType.AUTO
기본값으로 커밋이나 쿼리 실행 시 플러시
FlushModeType.COMMIT
커밋할 때만 플러시
근데 이건 건들 필요 없고 그냥 기본 값으로 쓰자..
플러시는!!!
- 영속성 컨텍스트를 실제로 비우지 않는다.
- 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화한다.(더티체킹)
- 트랜잭션이라는 작업 단위로 작동한다
- 커밋 직전에만 동기화하면 된다.