본문 바로가기

Dev/JPA

RS) 플러시(flush)

플러시(flush)란?

  • 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것

플러시가 발생되면?

  • 변경 감지
  • 수정된 엔티티 쓰기 지연 SQL 저장소에 등록
  • 쓰기 지연 SQl저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리)
  • 영속성 컨텍스트를 비우는 것이 아니다.

플러시하는 방법

  1. em.flush() : 직접 호출방법
  2. 트랜잭션 커밋 : 플러시 자동호출
  3. JPQL 쿼리 실행 : 플러시 자동호출
try{
    Member member = new Member(200L, "member200");
    em.persist(member);

    // 플러시 했기때문에 하단에 ===== 하기전에 쿼리가 날라간다.
    // 직접 여기서 플러시 하지 않아도 하단에 트랜잭션을 커밋하게 되면 자동으로 플러시된다.
    em.flush(); 

    System.out.println("=================");

    tx.commit(); // 커밋하는 순간 디비에 날라간다.
    
/* 실행 결과

Hibernate: 
    /* insert hellojpa.Member
        */ insert 
        into
            Member
            (name, id) 
        values
            (?, ?)
=================
*/

 

플러시 모드 옵션

ex) em.setFlushMode(FlushModeType.COMMIT)

  • FlushModeType.AUTO - 커밋이나 쿼리를 실행할 때 플러시(기본 값)
    • ex) JPQL 쿼리 실행시 플러시가 자동으로 호출되는 이유 
      • em.persist(memberA);
        em.persist(memberB);
        em.persist(memberC);
        
        /*
        	persist를 통해 memberA, memberB, memberC에 대한 쿼리는 SQL 쓰기 저장소에 쌓여있다
        	실제로는 디비에 값이 들어가있는 것이 아닌 상태이다.
            이럴 경우 아래와 같이 JPQL을 통해 조회문을 실행하면, 아무런 데이터를 못가져오게 되는데 문제가 되는 상황을
            고려하여 플러시 기본옵션값을 통해 JPQL을 시행시에는 자동으로 플러시되게 된다.
        */
        
        
        // 중간에 JPQL 실행
        query = em.createQuery("select m from Member m", Member.class);
        List<Member> members = query.getResultList(0;
  • FlushModeType.COMMIT - 커밋할 때만 플러시

 

'Dev > JPA' 카테고리의 다른 글

RS) 객체 테이블 매핑  (0) 2022.02.02
RS) 준영속 상태  (0) 2022.02.01
RS) 영속성 컨텍스트  (0) 2022.02.01
RS) JPA 어플리케이션 실습  (0) 2022.02.01
RS) JPA(Java Persistence API)  (0) 2022.02.01