[영속성 관리] 준영속 상태
영속 상태가 되는 경우
i) em.persist()를 할 때
ii)em.find()를 했을 때 엔티티가 1차 캐시에 없을 때
1차 캐시에 없으면 엔티티를 DB에서 조회해 1차 캐시에 저장된다.
1차 캐시에 올라가 JPA가 관리하는 상태를 영속 상태라고 한다.
준영속 상태
영속 상태의 엔티티가 영속성 컨텍스트에서 분리되는 것이다.
준영속 상태에서는 영속성 컨텍스트가 제공하는 기능을 사용하지 못한다.
준영속 상태로 만드는 방법
em.detach(entity)
특정 엔티티만 준영속 상태로 전환한다.
em.find()에서 150L Member는 영속성 컨텍스트에 없으므로 영속성 컨텍스트에 저장된다. (영속화)
em.detach() 후에는 준영속 상태가 되어 영속성 컨텍스트에서 관리가 되지 않는다.
//영속 상태
Member member = em.find(Member.class, 150L);
member.setName("AAA");
//준영속 상태
em.detach(member);
System.out.println("==============")
tx.commit();
따라서 setName()으로 member를 업데이트해도 변경 감지가 되지 않는다.
이로 인해 update 쿼리문이 출력되지 않는다.
em.clear()
엔티티 매니저 안에 있는 영속성 컨텍스트를 통째로 지운다.
Member member = em.find(Member.class, 150L);
member.setName("AAA");
em.clear();
Member member2 = em.find(Member.class, 150L);
System.out.println("===============");
tx.commit();
첫 번째 select문으로 member를 영속성 컨텍스트에 저장했다.
하지만 em.clear()로 영속성 컨텍스트가 초기화되었다.
영속성 컨텍스트에 다시 올리기 위해 두 번째 select문이 나간다.
em.clear()는 테스트 케이스 작성 시 쿼리문을 보기 위해 자주 사용한다.
em.close()
영속성 컨텍스트를 종료한다.
Reference
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자
www.inflearn.com