- 영속성 컨텍스트란 무엇인가.
- 실제 DB에 저장하는 것이 아니라
- 엔티티를 "영속컨텍스트에" 저장한다는 의미이다.
- JPA를 이해하는데 가장 중요한영어
- "엔티티를 영구 저장하는 환경"이라는 의미를 가진다.
- EntityManager.persist(entity)
- 매니저(EntityManager)를 통해 영속성 컨텍스트(persistence)에 접근한다.
- 비영속 컨텍스트
- 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태
- JPA가 관리하지 않는 상태
//객체를 생성한 상태(비영속)
Admin admin = new Admin();
admin.setId("member1");
admin.setUsername("회원1");
//영속상태
em.persist()
- 준영속 (detached)
- 영속성 컨텍스트에 저장되었다가 분리된 상태
//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태 - em.detach()
- 영속성 컨텍스트에 저장되었다가 분리된 상태
Admin admin = em.find(Admin.class , 101L);
admin.setName("AAAAAA");
//JPA에서 관리하지 않는다.
em.detach(admin);
//영속성 컨테스트의 내용을 전부 초기화
em.clear();
- 그렇다면 영속성 속성을 클리어하고 다시 조회 하게 어떻게 될까 ?
- 아래의 예시를 보면 "em.clear" 또는 em.detach를 사용시에는 영속성관리를 하지 않게 됨으로
- admin 과 admin1은 1차캐시된 데이터를 가져오지 않으므로 false가 나오게 된다.
Admin admin = em.find(Admin.class , 101L);
admin.setName("AAAAAA");
//JPA에서 관리하지 않는다.
em.detach(admin);
em.clear();
Admin admin1 = em.find(Admin.class,101L);
System.out.println(admin == admin1);
- 영속이란
- 실제 영속컨테스트가 관리하는 1차캐시에 데이터가 없으면 DB에서 데이터를 가져와 캐시에 담아 JPA가 관리하는 것
- 데이터의 동일성
- JPA가 "영속엔티티"의 동일성을 보장해준다.
- 1차 캐시로 반복가능한 읽기(RePEATABLE READ) 등급의 트랜잭션 격리 수준을 데이터베이스가 아닌 애플리케이션 차원에서 제공
- 엔티티 수정 감지
- JPA는 변경감지 기능이 있어서 "엔티티"의 변경
- JPA는 자바의 Collection을 변경하듯이 "값만 변경했지만" update가 되었다 .
Admin admin = em.find(Admin.class,101L);
admin .setName("나승후1111");