인프런 - 자바 ORM 표준 JPA 프로그래밍 - 기본편 강의노트
준영속 상태
영속상태에서 준영속 상태가 되는 것
영속 상태가 되는 경우 : persist(), find()해서 1차 캐시에 없을 때
영속 상태의 엔티티가 영속성 컨텍스트에서 분리(datached)
영속성 컨텍스트가 제공하는 기능을 사용하지 못함 ( ex. 더티체킹 )
준영속 상태로 만드는 방법
em.datach(entity)
특정 엔티티만 준영속 상태로 전환
Member member = em.find(Member.class, 150L); // 영속 상태
member.setName("AAAAA");
em.detach(member); // 준영속 상태
System.out.println("=========================");
tx.begin();
member의 값을 바꿔주었는데도 불구하고 detach()를 써서 member를 준영속 상태로 만들었기 때문에 UPDATE 쿼리는 나가지 않고, 처음 찾아온 find 쿼리만 날아간 것을 볼 수 있다.
em.clear()
영속성 컨텍스트를 완전히 초기화
Member member = em.find(Member.class, 150L);
member.setName("AAAAA");
em.clear(); // 영속성 컨텍스트 초기화
Member member2 = em.find(Member.class, 150L);
System.out.println("=========================");
tx.commit();
처음에 member는 1차 캐시에 없는 상태이기 때문에 DB에 쿼리문을 날려서 찾아온 다음, 영속성 컨텍스트 1차 캐시에 저장해 둔다. 그리고 member의 내용을 바꾼 뒤, 영속성 컨텍스트를 초기화하면 1차 캐시도 없어지고, member는 준영속 상태가 되어 dirty checking을 쓸 수 없다. 이 때, member와 같은 member2를 찾아오면 1차 캐시에 member가 없기 때문에 다시 한 번 쿼리를 날려 찾아오는 걸 확인할 수 있다.
em.close()
영속성 컨텍스트를 종료
'STUDY > JPA' 카테고리의 다른 글
[4-2] Entity Mapping - 객체&테이블, 필드&컬럼 (0) | 2023.07.19 |
---|---|
[4-1] JPA - DDL 자동 생성 (0) | 2023.07.07 |
[3-3] 플러시 (0) | 2023.07.05 |
[3-2] 영속성 컨텍스트의 이점 (+Batch) (0) | 2023.07.04 |
[3-1] 영속성 컨텍스트란? (0) | 2023.07.03 |