JPA
3.5 플러시
fmoths
2021. 1. 9. 16:15
플러시(flush())는 영속성 컨텍스트의 변경 내용을 데이터 베이스에 반영한다.
1. 변경 감지가 동작해서 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해서 수정된 엔티티를 찾는다. 수정된 엔티티는 수정쿼리를 만들어 쓰기 지연 SQL 저장소에 등록한다.
2. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다. (등록, 수정, 삭제 쿼리)
영속성 컨텍스트를 플러시하는 방법
1. em.flush()를 직접 호출한다.
2. 트랜잭션 커밋시 플러시가 자동 호출된다.
3. JPQL 쿼리 실행 시 플러시가 자동 호출된다.
- 직접호출
엔티티 매니저의 flush() 메소드를 직접 호출해서 영속성 컨텍스트를 강제로 플러시한다.
테스트나 다른 프레임워크와 함께 JPA를 사용할 때를 제외하고 거의 사용하지 않는다.
- 트랜잭션 커밋시 플러시 자동호출
트랜잭션을 커밋하기 전에 꼭 플러시를 호출하여 DB에 변경내용이 반영되도록 한다.
- JPQL 쿼리 실행 시 플러시 자동호출
JPQL이나 Criteria 같은 객체지향 쿼리를 호출할 때도 플러시가 실행된다.
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
JPQL이 실행 되기전에 이전에 적용한 영속성 컨텍스트가 DB에 반영되야 JPQL이 정확히 실행될 수 있기 때문.
3.5.1 플러시 모드 옵션
- FlushModeType.AUTO : 커밋이나 쿼리를 실행할 때 플러시(기본값)
- FLushModeType.COMMIT : 커밋할 때만 플러시
em.setFLushMode(FLushModeType.COMMIT); //플러시 모드 직접 설정