JPA
가장 중요한 2가지
매핑하는 것(정적 관점)
영속성 컨텍스트(내부구조와 동작 방식)
jpa의 모든 데이터 변경이나, 로직들은 transaction안에서 실행되어야 한다.
하이버네이트 entitymanager의존성을 가져오면, jpa interface도 들어있다.
영속성 컨텍스트
뜻
엔티티를 영구 저장하는 환경
EntityManager를 생성하면 그 안에 영속성 컨텍스트가 있다.
영속성 컨텍스트의 이점
- 캐싱 해준다. (1차 캐시를 먼저 뒤지고) 없으면 db에서 뒤진다.
- 영속성 엔티티의 동일성 보장해준다.
- 트렌젝션을 지원하는 쓰기 지원
쓰기 지연 SQL저장소에 저장해놓았다가 -> em.commit()시에 한꺼번에 실행한다.
<property name="hibernate.jdbc.batch_size" value="10"/>
를 persistence.xml에 추가하면 배치사이즈를 조절할 수 있다.
- 변경감지 가능
commit시 내부적으로 flush()라는 것이 호출됨
-> 1차 캐시에서 엔티티와 스냅샷을 비교함
-> 바뀌었으면 update query를 쓰기 지연 sql 저장소에 만들어둠
-> 데이터베이스에 반영
플러시
쌓아뒀던 sql을 데이터베이스에 넘김
영속성 컨텍스트의 변경사항과 데이터베이스를 맞추는 사항
flush()를 실행하면 생기는 일
변경감지 발생
수정된 엔티티를 쓰기 지연 SQL 저장소에 등록
쓰기지연 SQL저장소의 쿼리를 데이터베이스에 넘김(등록, 수정, 삭제 쿼리)
flush 실행 방법
- em.flush()
- tx.commit()
- JPQL쿼리 실행 : JPQL로 조회할 때는 바로 실행됨. 조회하려는데 위에 sql문이 쓰기지연으로 저장되어 있으면 안되기 때문임.
준영속 상태