📝 플러시
- 플러시(flush())는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영한다.
- 플러시라는 이름으로 인해 영속성 컨텍스트에 보관된 엔티티를 지운다고 생각하면 안 된다. 즉, 변경내용을 데이터베이스에 동기화하는 것이 플러시이다.
1. 동작방법
- 변경감지가 동작해서 영속성 컨텍스트에 잇는 모든 엔티티를 스냅샷과 비교해서 수정된 엔티티를 찾는다. 수정된 엔티티는 수정쿼리를 만들어 쓰기 지연 SQL 저장소에 등록한다.
- 쓰기지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다
2. 영속성 컨텍스트를 플러시하는 3가지 방법
- em.flush() 호출
- 트랜잭션 커밋 시 flush() 자동호출
- JPQL 쿼리 실행 시 flush() 자동호출
em.persist(memberA)
em.persist(memberB)
//JPQL
query = em.createQuery("select m from Member m", Member.class);
- JPQL은 SQL로 변환되어 DB에서 엔티티를 조회환다. 그런데 memberA, memberB는 아직 DB에 있지 않다. 그래서 쿼리 실행 전 플러시를 해줘야 한다.
3. 옵션
- FlushModeType.AUTO : 커밋이나 쿼리 실행 시(default)
- FlushModeType.COMMIT : 커밋할 때만