본문 바로가기
자바/JPA

[JPA/JAVA] 플러시 & 준영속 상태

by drCode 2023. 1. 12.
728x90
반응형

플러시란? 

 : 영속성 컨텍스트의 변경내용을 데이터베이스에 반영

 

플러시가 발생하는 때는?

 - 변경을 감지할 때

 - 수정된 엔티티를 쓰기 지연 SQL 저장소에 등록할 때

 - 쓰기 지연 SQL 저장소의 쿼리(등록, 수정, 삭제 쿼리)를 데이터베이스에 전송할 때

 

영속성 컨텍스트를 플러시하는 방법은 3가지가 있는데 

 - em.flush()  -- 직접 호출

 - 트랜잭션 커밋 -- 플러시를 자동 호출

 - JPQL 쿼리 실행 -- 플러시를 자동 호출

 

가 있다.

 

직접 호출하는 em.flush()의 경우

Member member = em.find(Member.class, 150L);
member.setName("ZZZZ");

em.flush();

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

 

원래는 트랜잭션 커밋이 실행될 때 flush가 자동으로 되는데,

 

위의 소스의 경우, 

 

원래는 "=================" 이것이 먼저 보이고,

 

이름이 "ZZZZ"로 바뀐 update 쿼리문이 실행되는데,

 

flush를 직접 한 경우라서 update 쿼리문이 실행되고 난 후, 

 

 "================="  가 출력된다.

 

플러시는 모드 옵션을 설정할 수 있다.

em.setFlushMode(FlushModeType.COMMIT)

 

플러시의 모드 옵션 은 두 가지가 있는데,

  - FlushModeType.AUTO

    : 커밋이나 쿼리를 실행할 때 플러시 (기본값)

  - FlushModeType.COMMIT

    : 커밋할 때만 플러시

 

플러시는

 - 영속성 컨텍스트를 비우지 않는다.

 - 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화

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

 

준영속 상태란?

(1) 영속이었던 상태에서 준영속으로 되는 것

(2) 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached) 되는 것

(3) 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다.

 

엔티티를 준영속 상태로 만드는 방법은

(1) em.detach(entity)

 - 특정 엔티티만 준영속 상태로 전환

(2) em.clear()

 - 영속성 컨텍스트를 완전히 초기화

(3) em.close()

 - 영속성 컨텍스트를 종료

 

 

728x90
반응형

댓글