JPA 영속성
영속성 컨텍스트
엔티티의 생명주기
- 비영속 : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- 영속 : 영속성 컨텍스트에 관리되는 상태
- 준영속 : 영속성 컨특세트에 저장되었다가 분리된 상태
- 삭제 : 삭제된 상태
영속성 컨텍스트 이점
- 1차 캐시
- 동일성 보장
- 트랜잭션을 지원하는 쓰기 지연
- 변경감지
- 지연로딩
1차 캐시
- 조회에서 1차 캐시에서 우선 찾음(DB에 먼저 조회 X) 만약 없다면 DB에서 조회 후 1차캐시에 저장 (DB 한 트랜잭션에서만 존재)
동일성 보장
- 영속성 컨텍스트에 있는 엔티티가 같다면 동일하게 인식(1차 캐시가 있어서 가능)
쓰기 지연
- 쓰기 지연 SQL 저장소에 commit 이전의 쿼리들을 저장했다가 한번에 실행 (버퍼링 가능 = 최적화 가능)
변경감지
- 조회 후 데이터를 변경하고 다시 영속 컨텍스트에 넣지 않아도 값만 변경하면 업데이트 쿼리가 전송.
Member findMember = em.find(Member.class, 1L);
//update
findMember.setName("HelloB");
//em.persist(findMember) 이렇게 다시 넣을 필요가 없다. 또는(em.update(findmember) -> X)
플러시
- 영속성 컨텍스트의 내용을 DB에 반영
- 트랜잭션 커밋 시 자동 호출
entityManager.flush()
로 호출- JPQL쿼리 호출시 자동 호출
- 영속성 컨텍스트를 비우지 않음
준영속
- 영속상태의 엔티티가 영속을 분리