본문 바로가기
Develop/JPA

[JPA/기본편] 준영속 상태

by J-rain 2024. 3. 20.

 

준영속 상태란

영속성 컨텍스트가 관리하는 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 것이다.

준영속 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다.

 

 

준영속 상태로 만드는 방법

영속 엔티티를 준영속 엔티티로 만드는 방법은 아래 3가지이다.

  •  em.detach(entity)  : 특정 엔티티만 준영속 상태로 전환한다.
  •  em.clear()  : 영속성 컨텍스트를 완전히 초기화한다.
  •  em.close()  : 영속성 컨텍스트를 종료한다.

엔티티를 준영속 상태로 전환: detach()

예제를 통해 detach() 메소드 사용과 영속성 컨텍스트의 상태 변화에 대해서 알아보자.

public void testDetached() {
  ...
  //회원 엔티티 생성, 비영속 상태
  Member member = new Member();
  member.setId("memberA");
  member.setUsername("회원A");

  //회원 엔티티 영속 상태
  em.persist(member);

  //회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
  em.detach(member);

  transaction.commit(); //트랜잭션 커밋
}

위 코드를 수행하면 member에 대한 영속성 컨텍스트의 상태는 아래의 과정을 거친다.

 em.detach(member)  를 호출하면 영속성 컨텍스트에 detach(memberA)를 전달한다.

 

그러면 영속성 컨텍스트는 아래의 과정으로 memberA에 대한 정보를 삭제한다.

 

  1.  detach(memberA)  전달 받았다.
  2. 1차 캐시에 memberA에 대한 정보를 제거한다.
  3. 쓰기 지연 SQL 저장소에서 memberA에 관련된 SQL을 제거한다.

이렇게 영속 상태에서 영속석 컨텍스트가 관리하지 않는 상태를 준영속 상태라고 한다.

 

 

영속성 컨텍스트 초기화: clear()

 em.detach()  가 특정 엔티티 하나를 준영속 상태로 만들었다면  em.clear()  는 영속성 컨텍스트를 초기화한다.

//엔티티 조회, 영속 상태
Member memberA = em.find(Member.class, "memberA");
Member memberB = em.find(Member.class, "memberB");

em.clear(); //영속성 컨텍스트 초기화

위 코드를 실행하면 영속성 컨텍스트 상태는 아래와 같이 변한다.

 

 

영속성 컨텍스트 종료: close()

영속성 컨텍스트를 종료하면 해당 영속성 컨텍스트가 관리하던 영속 상태의 엔티티가 모두 준영속 상태가 된다.

public void closeEntityManage() {
  EntityManagerFactory emf =
      Persistence.createEntityManagerFactory("jpabook");

  EntityManager em = emf.createEntityManager();
  EntityTransaction transaction = em.getTransaction();

  transaction.begin(); //[트랜잭션] - 시작

  Member memberA = em.find(Member.class, "memberA");
  Member memberB = em.find(Member.class, "memberB");

  transaction.commit(); //[트랜잭션] - 커밋

  em.close(); //영속성 컨텍스트 닫기(종료)
}

위 코드를 실행하면 영속성 컨텍스트 상태는 아래와 같이 변한다.

 

'Develop > JPA' 카테고리의 다른 글

[JPA/기본편] 연관관계  (1) 2024.03.20
[JPA/기본편] 엔티티 매핑  (0) 2024.03.20
[JPA/기본편] 플러시  (0) 2024.03.20
[JPA/기본편] 영속성 컨텍스트  (0) 2024.03.20
[JPA/기본편] JPA  (0) 2024.03.19

댓글