준영속 상태

  • 영속

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

    • insert뿐만 아니라 조회할 때 1차 캐시에 없어서 DB에서 가져와 1차 캐시에 올리는 상태도 포함된다.

  • 준영속

    • 영속 상태의 Entity가 영속성 컨텍스트에서 분리되는 상태

    • detach()를 실행하면 트랜잭션을 커밋해도 영향을 받지 않는다.

    • 영속성 컨텍스트가 더 이상 관리하지 않는 상태가 된다.

    • 즉, 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다.

준영속 상태로 만드는 법

  • em.detach(entity)

    • 특정 Entity만 준영속 상태로 전환한다.

  • em.clear()

    • 영속성 컨텍스트를 통으로 지운다.

    • 즉, 완전히 초기화한다.

    • 1차 캐시 등이 다 사라졌기 때문에 같은 데이터를 조회해도 다시 DB에서 가져온다.

  • em.close()

    • 영속성 컨텍스트를 종료한다.

public class JpaMain {

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

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

        entityManager.clear();

        // 영속성 컨텍스트를 지워서 1차 캐시에 없으므로 다시 올리기 위해 select 쿼리가 다시 실행된다.
        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=?
-----

Last updated