- 플러시(flush)란?
영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것이다.
데이터베이스 commit시점에서 플러시가 일어나게 된다. 즉 영속성컨텍스트와 데이터베이스를 맞추는 것이다.
- 플러시 발생
-변경 감지
-수정된 엔티티 쓰기 지연 sql저장소에 등록
영속성 컨텍스트를 플러시 하는 방법
- em.flush(직접 호출)
- 트랜잭션 commit - 자동호출
- jpql쿼리 실행 -자동호출
예를 들자면 아래 코드와 같다.
Member member = new Member(20L, "member20");
em.persist(member);
em.flush();
tx.commit();
위의 코드와 같이 flush()를 호출하여 직접 쿼리를 보내고 commit을 하였다.

플러시는 영속성 콘텍스트를 비우는 것이 아니고, 변경내용을 데이터베이스에 동기화시키는 것이다.
- 준영속 상태
-영속 -> 준영속
-영속 상태의 엔티티가 영속성컨텍스트에서 분리되었을 때(detached)
- 준영속 상태로 만드는 방법
-em.detach() - 특정 엔티티만 준영속 상태로 전환
-em.clear() - 영속성 컨텍스트를 완전히 초기화
-em.close() - 영속성 컨텍스트를 종료
//영속
Member member = em.find(Member.class, 11L);
member.setName("ccccc");
//분리
em.detach(member);
tx.commit();

위의 코드를 보면 em.find에서 영속성 컨텍스트에 등록 후 setName으로 기존의 데이터의 값을 변경하고, em.detach()로 영속성컨텍스트의 member를 분리하였다.
위의 결과 화면에서 보면 데이터가 수정되었음에도 불구하고 em.find에서 조회한 select 쿼리만 나가게 되고 update쿼리는 나가지 않게 된 것을 볼 수가 있다.
만약 여기서 아래 코드와 같이 변경을 하게 된다면?
//영속
Member member = em.find(Member.class, 11L);
member.setName("ccccc");
//분리
em.detach(member);
//영속
Member member1 = em.find(Member.class, 11L);

위의 코드에서 영속성 컨텍스트를 분리 후 다시 find로 같은 엔티티를 조회한 결과 select 쿼리가 두 번 나가게 되는 것을 볼 수가 있다.
처음 영속 상태에서 값을 변경하였을 때 한번, em.detach(member)로 분리하여 update쿼리가 나가지 않고 분리 되게 되고, 다시 em.find로 같은 엔티티를 조회하여 영속성 컨텍스트에 등록해서 위와 같이 select쿼리가 두 번 나가게 된다.
출처 : https://www.inflearn.com/course/ORM-JPA-Basic#

'JPA' 카테고리의 다른 글
다양한 연관관계 매핑 (0) | 2021.10.09 |
---|---|
연관관계 매핑 (0) | 2021.10.08 |
엔티티 매핑 (0) | 2021.10.07 |
영속성 컨텍스트, 1차캐시, 변경감지 (0) | 2021.10.05 |
ORM-JPA (0) | 2021.10.05 |