플러시 발생
- 변경감지
- 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송( 등록, 수정, 삭제 쿼리 )
보통 transaction.commit과 동시에 쿼리를 DB에 날리는데
내가 쿼리를 미리 보고싶거나, DB에 먼저 넣고 싶을때 사용!
아래 예시를 보면 commit이 실행되기 전에 insert문이 먼저 실행된다.
Member member = new Member(200L, "member200");
em.persist(member);
em.flush();
System.out.println("=======================");
tx.commit(); // commit을 실행하면서 쿼리를 DB에 날림
★ JPQL 쿼리 실행 시에는 플러시가 자동으로 실행된다!
// persist만 해주고 아직 commit이 안됐으니 DB에 삽입 전이다.
em.persist(mamberA);
em.persist(mamberB);
em.persist(mamberC);
// 이때 JPQL로 전체 멤버를 검색하면 아직 commit 되지 않아 데이터가 없기에 에러가 생길수 있음!
// 따라서 JPQL 전에는 무조건 플러시를 진행하고 실행시킨다.
query = em.createQuery("select m from Member m", Member.class);
List<Member> members = query.getResultList();
플러시 모드 옵션
- FlushModeType.AUTO( default 값 ) : 커밋이나 쿼리를 실행 할 때 플러시
- FlushModeType.COMMT : 커밋할 때만 플러시 ( JPQL를 사용하기 전에 굳이 플러시를 안해도 될때 사용 - 잘 안씀)
※ 플러시 정리
- 플러시를 실행한다고 영속성 컨텍스트를 비우지 않음( 1차캐시도 비우지 않음 )
- 영속성 컨텍스트 변경내용을 DB에 동기화
- 트랜잭션이라는 단위가 중요하다! → 커밋 직전에만 동기화 하면됨
'JAVA' 카테고리의 다른 글
[JAVA] JPA 엔티티 매핑 + DB 스키마 자동생성 (0) | 2021.11.10 |
---|---|
[JAVA] JPA 준영속 상태 (0) | 2021.11.09 |
[JAVA] JPA 영속성 관리 (0) | 2021.11.09 |
[JAVA] JPA 애플리케이션 개발 (0) | 2021.11.02 |
[JAVA] JPA 프로젝트 생성(Maven) + 기본설정 (0) | 2021.11.02 |