JPA/JPA 기본

9. 준영속 상태

sdafdq 2023. 10. 20. 17:58

영속 상태는 영속성 컨텍스트 안에 있는 상태

 

준영속 상태는 엔티티가 영속성 컨텍스트에서 분리된 상태.

 

 

영속상태는 persist 하거나 find 해서 DB에서 찾아왔을 때 영속성 컨텍스트의 1차 캐시에 넣어지면서 

이렇게 영속성 컨텍스트 안에서 관리되게 되는 것 들을 영속 상태 라고 함.

 

 

준영속은 영속성 컨텍스트에서 벗어난 거니 영속성 컨텍스트가 관리해주는 대상에 포함되지 않음.

 

더티체킹 등.

 

준영속으로 만드는 방법은

 

em.detach(member);   //특정 엔티티를 준영속 상태로 만듦.
em.clear();          //영속성 컨텍스트를 완전히 clear 함
em.close();          //아예 영속성 컨텍스트를 닫아버림.

detach()를 쓰면 member와 관련된 모든 것들이 영속성 컨텍스트에서 빠져나감. 뭐 스냅샷 이런 거 말하는 듯.

 

뭐 이렇고,

준영속 상태에 대해 예를 들면,

 

Member member = em.find(Member.class, 150L);
member.setName("asdf");

이거는 지금 영속 상태기 때문에 commit 시점에 반영이 됨.

영속성 컨텍스트에 있는 초기 원본의 스냅샷과 비교해서 바뀐점을 찾아보고 있으면 그 내용을 SQL로 만들어 DB에 보내기 때문.

실제로 바뀜.

 

Member member = em.find(Member.class, 150L);
em.detach(member);
member.setName("준영속");

이건 업데이트 쿼리 자체를 안날리고, 그러므로 당연히 바뀌지도 않음.

 

직접 쓸 일은 없음.

 

 

Member membe1r = em.find(Member.class, 150L);
em.detach(member1);
Member member2 = em.find(Member.class, 150L);

이러면 조회 두번함. 

원래 캐싱때문에 영속성 컨텍스트에 있는 거 주는건데,

영속성 컨텍스트에 없으니 select 해서 다시 가져옴.

 

 

어 뭔가 기능으로써 사용한다기 보다, 

SQL 어떻게 날라가는지 알고 싶을 때 쓸 듯.

flush()나 준영속 상태 만드는 거

 

 

 

 

em.close();
Member member = new Member(222L, "영속성컨텍스트 닫음");
em.persist(member);

이렇게 그냥 닫고 시작하면 아무것도 안된다.

쿼리 같은 거 날리지 않는다. 

 

 

'JPA > JPA 기본' 카테고리의 다른 글

11. DB 스키마 자동 생성  (0) 2023.10.21
10. 객체와 테이블의 매핑  (0) 2023.10.21
8. 플러시  (0) 2023.10.20
7. 영속성 컨텍스트 2  (0) 2023.10.20
6. 영속성 컨텍스트  (0) 2023.10.20