영속
준영속
영속 상태의 Entity가 영속성 컨텍스트에서 분리 (detached)
detach()를 실행하면 트랜잭션을 커밋해도 영향을 받지 않는다.
-> 영속성 컨텍스트가 더 이상 관리하지 않는 상태가 된다.
-> 즉, 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다.
em.detach(entity)
특정 Entity만 준영속 상태로 전환
em.clear()
영속성 컨텍스트를 완전히 초기화
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.