플러시 (Flush)
플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 기능을 한다.
트랜잭션이 커밋될 때, 플러시가 동작해 쓰기 지연 SQL 저장소에 쌓아뒀던 쿼리들을 데이터베이스에 전송한다.
즉, 영속성 컨텍스트와 데이터베이스를 동기화하는 작업이다.
※ 플러시가 발생해도 1차 캐시 안의 내용은 삭제되지 않는다.
직접 호출 (em.flush())
//영속 상태인 member 엔티티
Member member = new Member(200L, "A");
em.persist(member);
//플러시를 직접 호출하면 쿼리가 플러시 호출 시점에 전송됨
em.flush();
transaction.commit();
JPQL 쿼리 실행 시 호출
JPQL 쿼리를 실행하는 다음 코드를 보자.
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//JPQL 실행 전 반드시 flush()로 DB를 동기화한다. (자동)
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
만약 JPQL로 SELECT 쿼리를 전송했을 때, 영속성 컨텍스트에는 존재하지만 아직 동기화(flush)를 하지 않아 데이터베이스에는 해당 엔티티가 존재하지 않을 경우 문제가 발생할 수 있다.
따라서, 반드시 JPQL 쿼리 실행 전 flush()를 호출해 데이터베이스를 동기화한 후 JPQL 쿼리를 실행한다. 따라서 자동으로 flush()가 호출된다.
플러시 모드 옵션
- em.setFlushMode(FlushModeType.AUTO);
커밋이나 쿼리를 실행할 때 플러시를 수행한다. (기본값)
- em.setFlushMode(FlushModeType.COMMIT);
커밋 할 때만 플러시를 수행한다.
Reference
자바 ORM 표준 JPA 프로그래밍
'Framework > JPA' 카테고리의 다른 글
[JPA] 영속성 컨텍스트 (Persistence Context) - (2) (0) | 2021.03.30 |
---|---|
[JPA] 영속성 컨텍스트 (Persistence Context) - (1) (0) | 2021.03.30 |
[JPA] 상속관계 매핑 (0) | 2021.03.30 |
[JPA] 다양한 연관관계 (0) | 2021.03.19 |
[JPA] 연관관계 매핑 (0) | 2021.03.16 |