플러시란,
영속성 컨텍스트의 변경 내용을 DB에 반영하는 것,
즉 쿼리를 날리는 것 일듯.
플러시가 발생하면 일어나는 일
변경 감지
엔티티의 변경된 사항을 SQL로 번역하여 쓰기 지연 SQL 저장소에 등록
쓰기 지연 SQL 저장소에 있는 쿼리들을 DB에 날림.
아마 긴 문장으로 같이 전송하지 않을까..?
플러시 직접 쓸 일은 없는데 테스트 등 알아는 놔야 한다고 함.
em.flush() 이게 플러스 직접 호출
나머지 자동 호출임. 트랜잭션 commit 시점에.
JPQL 했을때도 자동호출이라는데 지금은 그냥 알아두기만 하라고 함..
플러시의 행동은, 위에 말했던 게 다임.
짧게 얘기하면, 그냥 변경감지 하고 변경된거 있으면 쓰기 지연 SQL 저장소에 들어가고,
쓰기 지연 SQL 저장소에 있는 쿼리들을 DB로 보내는 것.
이게 다임.
그리고, 플러시 한다고 commit 하는 건 아님.
EntityManager에서 가져온 transaction으로 commit해야 커밋임.
JPQL 날리면 flush 하도록 만든 이유는,
일단 SQL문이 뭘 날릴지도 모르고, 영속성 컨텍스트와 관계 없는 것 이기 때문에,
그냥 일단 지금까지의 상태들 다 반영 시킨 다음에 JPQL을 실행하려고.
플러시 모드를 설정할 수 있는데, 우리가 쓸 일은 없음.
em.setFlushMode(FlushModeType.COMMIT);
뭐 이런 식으로 하는 거임.
기본값은 AUTO임. commit 시점이나 쿼리 실행시
COMMIT은 커밋할 때만.
참고로, flush() 한다고 그것이 영속성 컨텍스트를 비우는 것은 아님.
하지만 당연히 쓰기 지연 SQL 저장소는 비운다.
'JPA > JPA 기본' 카테고리의 다른 글
10. 객체와 테이블의 매핑 (0) | 2023.10.21 |
---|---|
9. 준영속 상태 (0) | 2023.10.20 |
7. 영속성 컨텍스트 2 (0) | 2023.10.20 |
6. 영속성 컨텍스트 (0) | 2023.10.20 |
5. 개발 (0) | 2023.10.19 |