Persistence Context
어플리케이션과 DB 사이에서 객체(엔티티)를 저장하는 가상의 DB와 같은 환경
- 식별자 값(@Id)에 따라 식별된다.
- 1차 캐시, 동일성 보장, 변경 감지, 트랜잭션을 지원하는 쓰기 지연, 지연 로딩의 장점
엔티티의 생명주기
비영속(New/Transient)
- Persistence Context와 전혀 관계가 없는 상태
영속(Managed)
- Persistence Context에 저장된 상태
- Persistence Context에 의해 관리된다는 뜻
준영속(Detached)
- Persistence Context에 저장되었다가 분리된 상태
em.detach()
, em.close()
, em.clear()
- 개발자가 직접 준영속 상태로 만드는 드물다
- 보통 Persistence Context가 종료될 때 준영속 상태가 된다
삭제(Removed)
- Persistence Context와 DB에서 삭제된 상태
- 삭제된 엔티티는 Garbage Collector가 처리Merge
기능
Merge
비영속, 준영속 엔티티를 영속 상태로 만드는 것
- Persistence Context에서 @Id 값으로 엔티티 검색 → 없으면 DB에서도 검색
- 엔티티 있으면(준영속) 불러서 병합
- 엔티티 없으면(비영속) 새로 생성해서 병합
Flush
Persistence Context의 변경 내용을 DB에 동기화하는 것
- 작업 방식
- 변경 감지 작동해서 모든 엔티티를 스냅샷과 비교
- 변경된 엔티티에 대해 수정 쿼리 작성하고 지연 SQL 저장소에 등록
- 쓰기 지연 SQL 저장소의 쿼리를 DB에 전송
- 호출 방법
- em.flush(): 거의 사용하지 않음
- tx.commit()