JPA 영속성

영속성 컨텍스트

엔티티의 생명주기

  1. 비영속 : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
  2. 영속 : 영속성 컨텍스트에 관리되는 상태
  3. 준영속 : 영속성 컨특세트에 저장되었다가 분리된 상태
  4. 삭제 : 삭제된 상태

영속성 컨텍스트 이점

  1. 1차 캐시
  2. 동일성 보장
  3. 트랜잭션을 지원하는 쓰기 지연
  4. 변경감지
  5. 지연로딩

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쿼리 호출시 자동 호출
  • 영속성 컨텍스트를 비우지 않음

준영속

  • 영속상태의 엔티티가 영속을 분리