준영속 상태란
영속성 컨텍스트가 관리하는 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 것이다.
준영속 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다.
준영속 상태로 만드는 방법
영속 엔티티를 준영속 엔티티로 만드는 방법은 아래 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에 대한 정보를 삭제한다.
- detach(memberA) 전달 받았다.
- 1차 캐시에 memberA에 대한 정보를 제거한다.
- 쓰기 지연 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 |
댓글