JPA) 내부구조 - 준영속 상태

Date:    Updated:

카테고리:

준영속 상태란?

  • 영속상태가 되는 조건
    • em.persist(entity)
      • Entity를 영속성 컨텍스트에 직접 등록
    • em.find(Member.class, 1L)
      • 영속성 컨텍스트에서 Entity를 찾을 때 1차 캐시에 존재하지 않으면 DB에서 찾아와 1차 캐시에 등록하게 된다.
  • 영속 상태의 Entity가 영속성 컨텍스트에서 분리(detach) 되는것을 뜻한다.

  • 준영속 상태가 되면 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다.
    • 동일성 보장, 변경 감지(Dirty Checking) 등

준영속 상태로 만드는 방법

  • em.detach(entity)
    tx.begin();
    Member member = em.find(Member.class, 10L);
    member.setName("AAAA");
    
    em.detach(member); // 준영속 상태
    
    tx.commit();  // 변경 감지가 일어나지 않음
    
    • 특정 Entity만 준영속 상태로 전환
    • 변경 감지에 의해 UPDATE SQL이 전송되어야 하지만 준영속 상태가 되었기 때문에 아무일도 일어나지 않는다.
  • em.clear()
    tx.begin();
    Member member = em.find(Member.class, 10L);
    member.setName("AAAA");
    
    em.clear(); // 영속성 컨텍스트 초기화
    
    tx.commit();  // 변경 감지가 일어나지 않음
    
    • 영속성 컨텍스트(1차 캐시)를 완전히 초기화
    • 영속성 컨텍스트 내 모든 Entity를 지우므로 사실상 준영속 상태가 되버림.
  • em.close()
    tx.begin();
    Member member = em.find(Member.class, 10L);
    member.setName("AAAA");
    
    em.close(); // 강제로 영속성 컨텍스트를 종료
    
    tx.commit();  // 변경 감지가 일어나지 않음
    
    • 영속성 컨텍스트를 종료
    • 영속성 컨텍스트가 종료되며 1차 캐시가 소멸하므로 영속성 컨텍스트 내 모든 Entity는 준영속 상태가 됨.

📣 Reference

본 포스팅은 김영한님의 강의를 듣고 스스로 정리 및 추가한 내용입니다.

자바 ORM 표준 JPA 프로그래밍 - 기본편

댓글남기기