[JAVA] JPA 플러시(flush)

[JAVA] JPA 플러시(flush)

플러시 발생

변경감지 수정된 엔티티 쓰기 지연 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 members = query.getResultList();

플러시 모드 옵션

FlushModeType.AUTO( default 값 ) : 커밋이나 쿼리를 실행 할 때 플러시 FlushModeType.COMMT : 커밋할 때만 플러시 ( JPQL를 사용하기 전에 굳이 플러시를 안해도 될때 사용 - 잘 안씀)

※ 플러시 정리

플러시를 실행한다고 영속성 컨텍스트를 비우지 않음( 1차캐시도 비우지 않음 )

영속성 컨텍스트 변경내용을 DB에 동기화

트랜잭션이라는 단위가 중요하다! → 커밋 직전에만 동기화 하면됨

from http://eunji-dev.tistory.com/46 by ccl(A) rewrite - 2021-11-09 13:01:40