플러시(flush)
flush
는 영속성 컨텍스트의 변경 내용을 DB와 동기화한다.
flush의 과정
- 변경감지 동작해서, 스냅샷으로부터 영속성 컨텍스트의 모든 엔티티를 비교한다.
- 변경사항에 대한 Update 쿼리를 SQL 저장소에 저장한다.
- 쓰기 지연 SQL 저장소의 쿼리를 DB에 반영한다.
flush 종류
em.flush()
를 직접 호출
엔티티 매니저에서 직접 em.flush()
를 호출해서 영속성 컨텍스트를 flush
한다.
em이 얻은 트랜젝션 commit 될 때, 자동 호출
트랜젝션이 종료될 때, 변경 사항을 SQL로 전달해야 한다.
따라서, flush
를 통해서 내부의 SQL 저장소의 쿼리들을 DB에 반영한다.
JPQL 쿼리 실행 전, 자동 호출
// A,B,C를 영속성 컨텍스트에 영속시킨다.
em.persist(A);
em.persist(B);
em.persist(C);
// 아직 DB에 반영되지않았다.
// 중간에 JPQL 실행
query = em.createQuery("select M from Member m", Member.class);
List<Member> members = query.getResultList();
// 결과에 A,B,C가 포함된다.
JPQL은 SQL로 변환되어 DB에서 조회된다.
하지만, A,B,C는 아직 DB에 반영이 되지 않은 상태다.
따라서 JPQL 실행 전, flush
를 통해서 영속성 컨텍스트와 DB를 동기화 시킨 후 조회한다.
flush()
옵션
FlushModeType.Auto
: 커밋이나 쿼리를 실행할 때 (기본)
FlushModeType.Commit
: 커밋을 실행할 때
Author And Source
이 문제에 관하여(플러시(flush)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@asdfg5415/플러시flush저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)