영속 상태는 영속성 컨텍스트 안에 있는 상태
준영속 상태는 엔티티가 영속성 컨텍스트에서 분리된 상태.
영속상태는 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 |