개발서적/자바 ORM 표준 JPA

[자바 ORM 표준 JPA 프로그래밍] 3.5 플러시

Reference. 자바 ORM 표준 JPA 프로그래밍

책 목차 및 이전 글

  • 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영
플러시 실행 순서
  1. 변경감지가 동작 모든 엔티티를 스냅샷과 비교해서 수정 엔티티를 찾음
  1. 수정된 엔티티는 수정 쿼리를 만들어 쓰기 지연 SQL 저장소에 등록
  2. 쓰기 지연소 SQL 저장소의 쿼리를 데이터베이스의 전달
영속성 컨텍스트를 플러시하는 방법 3가지
  1. em.flush()를 직접 호출
  1. 트랜잭션 커밋 시 플러시 자동 호출
  1. JPQL 쿼리 실행 시 플러시 자동 호출

 

  • 직접 호출
    • 엔티티 매니저의 flush() 메소드를 직접 호출, 강제로 플러시
    • 거의 사용하지 않으며, 테스트나 다른 프레임워크와 JPA를 사용할때 간혹 쓰임
  • 트랜잭션 커밋 시 플러시 자동 호출
    • 데이터베이스에 변경 내용을 전달하지 않고 트랜잭션 커밋시 반영이 안됌
    • JPA는 위와 같은 상황을 예방하고자 트랜잭션 커밋할 때 플러시를 자동 호출
  • JPQL 쿼리 실행 시 플러시 자동 호출
    • 쿼리를 실행하기 직전에 영속성 컨텍스트를 플러시해서 변경 내용을 반영 필요
    • JPA는 JPQL을 실행할 때 플러시를 호출하여 쓰기 지연 저장소와 데이터베이스를 동기화
//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();

3.5.1 플러시 모드 옵션

  • 플러시 모드를 직접 지정하려면 javax.persistence.FlushModeType 을 사용
    • FlushModeType.AUTO: 커밋이나 쿼리를 실행할 때 플러시 (기본값)
    • FlushModeType.COMMIT: 커밋할 때만 플러시
  • 플러시를 통해 엔티티를 지우는 것이 아니라, 변경 내용을 데이터베이스와 동기화하는 작업
em.setFlushMode(FlushModeType.COMMIT) //플러시 모드 직접 설정