3. 영속성 관리 - (3.3 준영속 상태)

HotFried·2023년 9월 25일
0

영속 VS 준영속

영속

  • 영속성 컨텍스트에서 관리되는 상태

준영속
영속 상태의 Entity가 영속성 컨텍스트에서 분리 (detached)

detach()를 실행하면 트랜잭션을 커밋해도 영향을 받지 않는다.
-> 영속성 컨텍스트가 더 이상 관리하지 않는 상태가 된다.
-> 즉, 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다.


준영속 상태로 만드는 법

  1. em.detach(entity)
    특정 Entity만 준영속 상태로 전환

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

  3. em.close()
    영속성 컨텍스트 종료

public class JpaMain {

    public static void main(String[] args) {
        
        ...

        Member member1 = entityManager.find(Member.class, 150L);
        member1.setName("AAAAA");

        entityManager.clear();

        // 영속성 컨텍스트를 초기화했다.
        // @Id 150인 객체가 1차 캐시에 존재하지 않으므로 select from where 쿼리 발생
        Member member2 = entityManager.find(Member.class, 150L);

        System.out.println("--------------------");

        tx.commit();
    }
}
Hibernate: 
    select
        member0_.id as id1_0_0_,
        member0_.name as name2_0_0_ 
    from
        Member member0_ 
    where
        member0_.id=?
Hibernate: 
    select
        member0_.id as id1_0_0_,
        member0_.name as name2_0_0_ 
    from
        Member member0_ 
    where
        member0_.id=?
--------------------

clear()를 이용해 영속성 컨텍스트를 초기화했다.
이후 @Id 150인 객체가 1차 캐시에 존재하지 않게 되므로 select from where 쿼리가 발생한다.

commit()시점이 아닌 em.find(Member.class, 150L)코드 실행 시점에 쿼리가 발생하는 것을 확인할 수 있다.


참고 :

김영한. 『자바 ORM 표준 JPA 프로그래밍』. 에이콘, 2015.

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

profile
꾸준하게

0개의 댓글