플러시란?
: 영속성 컨텍스트의 변경내용을 데이터베이스에 반영
플러시가 발생하는 때는?
- 변경을 감지할 때
- 수정된 엔티티를 쓰기 지연 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()
- 영속성 컨텍스트를 종료
'자바 > JPA' 카테고리의 다른 글
[JPA/JAVA] 다양한 연관관계 매핑 (N:1, 1:N, 1:1, N:M) (0) | 2023.02.20 |
---|---|
[JPA/java] 연관관계 매핑 (단방향, 양방향, 객체, 테이블, 기본키, 외래키 등) (3) | 2023.01.25 |
[JPA/Java] 엔티티 매핑 (객체, 테이블, 필드, 컬럼, 기본 키 등) (0) | 2023.01.22 |
[JPA/JAVA] 영속성 컨텍스트 (0) | 2023.01.11 |
[Java/JPA] JPA 개념 (0) | 2021.10.15 |
댓글