플러시
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
- 변경감지
- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송한다. (등록, 수정, 삭제 쿼리).
- 영속성 컨텍스트를 플러시하는 방법은 3가지이다.
- em.flush()를 직접 호출한다.(test할 때는 사용됨.)
- 트랜잭션 커밋 시 플러시가 자동 호출된다.
데이터베이스에 변경 내용을 SQL로 전달하지 않고 트랜잭션만 커밋하면 어떤 데이터도 데이터 베이스에 반영되지 않는다.
따라서 트랜잭션을 커밋하기 전에 꼭 플러시를 호출해서 영속성 컨테긋트의 변경 내용을 데이터베이스에 반영해야 한다. JPA는 이런 문제를 예방하기 위해 트랜잭션을 커밋할 때 플러시를 자동으로 호출한다.
- JPQL 쿼리 시 플러시가 자동 호출된다.
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//중간에 JPQL 실행
query = em.createQuery("select m from Member m", Member.class);
List<Member> members= query.getResultList();
- 왜 JPQL 쿼리를 실행할 때 플러시가 자동 호출될까?
쿼리를 실행하기 직전에 영속성 컨텍스트를 플러시해서 변경 내용을 데이터베이스에 반영해야 한다. JPA는 이런 문제를 예방하기 위해 JPQL을 실행할 때도 플러시를 자동 호출한다.정리
- 영속성 컨텍스트를 비우지 않음
- 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화
- 트랜잭션이라는 작업 단위가 중요 ->커밋 직전에만 동기화하면 됨.