본문 바로가기

Spring/JPA & Hibernate

준영속 상태

반응형

준영속 상태

  • 영속 상태인 경우, 준영속 상태가 될 수 있다.
  • 영속 상태의 엔티티를 영속성 컨텍스트에서 분리하는 것(detached)  
  • 영속성 컨텍스트가 제공하는 기능(1차 캐시, 더티체킹 등)을 사용 못함
<복습> 영속이란?
엔티티가 영속성 컨택스트에 의해 관리되는 상태를 말한다.

영속 상태로 만드는 2가지 방법
1. em.persist(entity); 를 통해 엔티티를 영속성 컨택스트에 저장
2. em.find(entity); 를 통해 데이터베이스에서 조회하는 경우, 엔티티를 영속성 컨택스트에 저장

// 영속 (db에 조회한 후, 영속성 컨텍스트에 올림)
Member member = em.find( Member.class, 150L );
member.setName( "AAAAA" );

// JPA의 관리 대상에서 제외
em.detach( member );

// dirty checking, 쓰기 지연 SQL 저장소의 쿼리 database에 반영, transaction commit
tx.commit();

실행 결과를 보면 알 수 있듯이, 영속성 컨텍스트의 관리 대상에서 제외된 member 객체는 그 값이 변경되었지만, UPDATE 쿼리는 발생하지 않았다.

 

그 이유는 em.detach(entity)
 를 통해 엔티티를 비영속 상태로 만들어버렸기 때문이다. 즉, 영속성 컨택스트의 모든 엔티티 관련 정보를 삭제했기 때문.

이처럼 엔티티가 비영속 상태가 되면, 1차 캐시의 데이터와 스냅샷과 비교하여 생성한 쿼리들은 반영되지 않는다.

준영속 상태로 만드는 방법

  • em.detach(entity)

    특정 엔티티만 준영속 상태로 전환 
  • em.clear()

    영속성 컨텍스트를 완전히 초기화 
  • em.close()

    영속성 컨텍스트를 종료

 

반응형

'Spring > JPA & Hibernate' 카테고리의 다른 글

연관관계 맵핑  (0) 2019.12.19
Entity Mapping  (0) 2019.12.19
플러시  (0) 2019.12.18
영속성 컨텍스트  (0) 2019.12.18
JPA Example  (0) 2019.12.18