엔티티 매니저에 의해 관리되며, DB와 애플리케이션 사이에서 엔티티의 일종의 저장소 같은 역할.
엔티티의 생명주기
비영속(New/Transient) 영속성 컨텍스트와 관계가 없는 상태.
영속(Managed) 영속성 컨텍스트에 저장된 상태
준영속(Detached) 영속성 컨텍스트에 저장되었다가 분리된 상태
삭제(Removed) 삭제된 상태
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
Member member = new Member();
member.setId(11L);
member.setName("Jack");
/* 여기까지는 비영속 */
em.persist(member); // 영속성 컨텍스트 관리 시작
em.clear(); // 준영속 상태로 영속성 컨텍스트 삭제
em.remove(member); // 비영속 상태로 영속성 컨텍스트와 DB 삭제
영속성 컨텍스트 관리의 장점
1차 캐시 영속성 컨텍스트에 저장해놓았다가 트랜잭션이 커밋되기 전까지 DB를 조회하지 않고 캐시에 있는 값을 조회합니다. 비즈니스 로직이 매우 복잡할 경우 약간의 이득이 있을 수 있지만 트랜잭션 내에서 일어나므로 효과는 크지 않을 수 있습니다.
동일성 보장 같은 트랜잭션 안에서 엔티티의 비교의 == 연산자를 통해 비교할 수 있습니다.
트랜잭션을 지원하는 쓰기 지연 트랜잭션 커밋 전까지 INSERT SQL을 쓰기 SQL 저장소에 모았다가 전송할 수 있습니다.
변경 감지 엔티티를 수정하면 스냅샷과 비교하여 변경된 부분이 있는 경우 업데이트 SQL을 쓰기 SQL 저장소에 저장했다가 트랜잭션 커밋 시 DB에 전송합니다.
플러시
플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영.
영속성 컨텍스트의 내용들을 DB와 동기화한다고 이해하면 됩니다.
이름 때문에 오해할 수 있지만 삭제하거나 비우는 작업이 아닙니다.
스냅샷과 비교해서 수정된 엔티티를 찾고, 수정된 엔티티에 대해 쿼리를 생성하여 쓰기 지연 SQL 저장소에 등록합니다. 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송합니다.