JPA에서 가장 중요한 2가지
1. 객체와 관계형 데이터베이스 맵핑하기
(Object Relational Mapping)
2. 영속성 컨텍스트
영속성 컨텍스트
- JPA를 이해하는데 가장 중요한 용어
- "엔티티를 영구 저장하는 환경"
- EntityManager.persist(entity);
연속성 컨텍스트는 보이지 않는 논리적인 개념이다.
엔티티 매니저를 통해서 영속성 컨텍스트에 접근을 한다.
엔티티의 생명주기
- 비영속 (new/transient)
영속성 컨텍스트와 전혀 관계가 없는 새로운 상태- 영속 (managed)
영속성 컨텍스트에 관리되는 상태- 준영속 (detached)
영속성 컨텍스트에 저장되었다가 분리되는 상태- 삭제 (removed)
삭제된 상태
영속 엔티티는 동일성을 보장한다.
트랜잭션을 지원하는 쓰기 지연
영속 엔티티에 여러 객체를 저장을 하면 쓰기 지연 SQL 저장소에 Insert 쿼리를 생성하여 저장하고 있다가 em.commit(); 시점에 데이터베이스에 쿼리를 보낸다.
영속성 컨텍스트의 장점 정리
- 1차 캐시
- 동일성(identity) 보장
- 트렌잭션을 지원하는 쓰기 지연
(transactional write-behind)- 변경 감지 (Dirty Checking)
- 지연 로딩 (Lazy Loading)
앞서 언급한 flush() 라는 기능은
영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 역활을 한다.
flush는 트랜잭션 안에서 작업 단위로 동작하기 때문에
commit 직전에만 동기화 하면된다.
flush가 발생 시 동작
변경감지
수정된 엔티티 쓰기 지연 저장소에 등록
쓰기 지연 저장소의 쿼리를 데이터베이스에 전송
(등록, 수정, 삭제 쿼리)
em.setFlushMode(FlushModeType.COMMIT)
출처 : https://inf.run/Q6fc