JAVA

[JAVA] JPA 영속성 관리

응디 2021. 11. 9. 11:21

영속성 컨텍스트란?

  • JPA를 이해하는데 가장 중요하다.
  • 엔티티를 연구 저장하는 환경이라는 뜻이다.
  • 영속성 컨텐스트는 눈에 보이는 것이 아니므로 EntityManager를 통해 접근한다.
// DB에 저장하는게 아닌 엔티티를 영속성 컨텍스트라는 곳에 저장하는것
EntityManager.persist(entity);

 

1. 비영속 상태

: JPA와 관련없음(EntityManager와 상관없음 + 사용하지않음)

// 비영속 상태
Member member = new Member();
member.setId(100L);
member.setName("HelloJPA");

 

2. 영속 상태

: EntityManager 사용 시점부터 영속 상태에 들어감 → 영속성 컨텍스트에 들어감

// 영속 상태
em.persist(member);

 

3. 준영속, 삭제

: em.detach(member) 실행하면 다시 영속성 컨텍스트에서 나옴

: em.remove()

 

 

4. 1차 캐시

  • JPA는 일단 조회하면 무조건 영속성 컨텍스트에 올려둔다. (같은걸 조회하면 1차캐시에서 찾아옴)
  • 영속성 컨텍스트에 들어가면 바로 DB에 들어가는것이 아닌 1차 캐시에 저장이 된다.
  • 아래 이미지에서 find를 실행했음에도 select가 실행되지 않는 이유는 DB에서 찾아오는것이 아닌 먼저 1차 캐시에서 검색해왔기 때문!!
// 비영속 상태
Member member = new Member();
member.setId(101L);
member.setName("HelloJPA");

// 영속 상태(여기까지는 아직 쿼리를 날리지 않음)
em.persist(member);

Member findMember = em.find(Member.class, 101L);

 

 

5. 엔티티 등록( 트랜잭션을 지원하는 쓰기 지연 )

  • memberA를 저장(persist) 하면 바로 DB로 쿼리를 날리는게 아니다.
  • 저장하면 1차캐시에서 저장하고 쓰기지연 SQL 저장소에 쿼리를 생성하여 저장해둔다. ( SQL INSERT A, SQL INSERT B 생성된것 확인)
  • 그럼 언제 DB로 날릴까?? transaction.commit 이 실행되면 DB로 쿼리를 날림!
    출처 : conatuseus님 블로그-[JPA] 영속성 컨텍스트 #2

6. 엔티티 수정

Member member = em.find(Member.class, 150L);
member.setName("ZZZZZ");

'JAVA' 카테고리의 다른 글

[JAVA] JPA 준영속 상태  (0) 2021.11.09
[JAVA] JPA 플러시(flush)  (0) 2021.11.09
[JAVA] JPA 애플리케이션 개발  (0) 2021.11.02
[JAVA] JPA 프로젝트 생성(Maven) + 기본설정  (0) 2021.11.02
[JAVA] JPA란?  (0) 2021.09.09