[JPA] flush (JPA 기본편 by 김영한)

su_y2on·2022년 1월 20일
0

JPA

목록 보기
3/17
post-thumbnail

flush

flush는 영속성 컨텍스트의 변경내용을 DB에 반영하는 것입니다. 크게 3가지 방법으로 flush를 할 수 있습니다.


em.flush()

이는 원하는 곳에서 flush를 하는 것으로 아래의 코드를 실행하면 변경사항이 flush때 DB에 반영되기 때문에 ========== 위쪽으로 수정쿼리가 나갑니다. 그리고 commit시에 flush가 또 일어나지만 이미 변경사항이 적용되어서 쿼리를 날릴게 없는 것입니다.

            // flush
            Member findMember = em.find(Member.class, 1L);
            findMember.setName("google");

            em.flush();

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

            tx.commit(); // DB에 쿼리가 날라가는 순간




tx.commit()

commit시에 자동으로 flush가 수행됩니다.




JPQL쿼리 실행

JPQL쿼리 실행시에도 자동으로 flush가 수행됩니다. 그 이유는 아래와 같은 경우 때문입니다. 아직 commit이 이뤄지지 않았기 때문에 persist시킨 memberA,B,C는 DB에 들어가지 않았고 이때 JPQL로 조회를 하면 당연히 없다고 나옵니다. JPQL은 1차 캐시를 거치지 않고 바로 sql로 변환되어 DB에 쿼리를 날리기때문에 이런경우를 위해서 JPQL이 실행되면 그전에 flush를 자동으로 호출합니다.

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();

0개의 댓글