본문 바로가기
IT/Java

Flush에 대해

by 성준하이 2022. 12. 8.
반응형

EntityManager를 사용해 작업을 수행해도 commit을 하기 전까지는 작업의 결과들이 DB에 반영되지 않는다.

정확히는 "Flush가 호출되기 전에는 DB에 반영되지 않는다"가 맞다.

 

Flush가 호출되면 영속성 컨텍스트 안에 보관되고있던 이전 작업들에 대한 결과가 실제 DB에 반영이 된다.

(영속성 컨텍스트를 비우는 것이 아니라 영속성 컨텍스트의 변경내용을 DB에 적용시켜 주는 것이다)

 

영속성 컨텍스트를 Flush하는 방법
  • em.flush()
    > 직접 호출하는 것이다.
  • transaction.commit()
    > 트랜잭션 커밋을 수행하면 플러시가 자동으로 호출된다.
  • JPQL
    > JPQL 쿼리를 실행하면 플러시가 자동으로 호출된다. JPQL은 SQL로 번역되어 DB에 바로 접근하게 된다. 이 경우에 만약 영속성 컨텍스트의 내용이 DB에 적용되지 않은 상태로 JPQL이 수행된다면 문제가 발생할 수 있으므로 JPQL 전에는 항상 flush를 먼저 수행한다.

 

 

영속성 컨텍스트의 생존 범위는 반드시 트랜잭션과 함께 동작하도록 해야 한다.

스프링 프레임워크를 사용하면 스프링에 의해 트랜잭션이 종료될 때 영속성 컨텍스트도 함께 종료되도록 동작한다.

반응형

'IT > Java' 카테고리의 다른 글

Entity 에서 date관련 annotation  (15) 2022.12.11
LinkedHashMap  (31) 2022.12.09
JPA query Keyword (repository)  (34) 2022.12.06
JPA메서드 save 와 saveAndFlush 비교  (32) 2022.12.05
spring annotation-driven 시 bean name 중복(충돌,conflicts) 해결  (35) 2022.12.04

댓글