on
[JAVA] JPA 영속성 관리
[JAVA] JPA 영속성 관리
영속성 컨텍스트란?
JPA를 이해하는데 가장 중요하다.
엔티티를 연구 저장하는 환경이라는 뜻이다.
영속성 컨텐스트는 눈에 보이는 것이 아니므로 EntityManager를 통해 접근한다.
// DB에 저장하는게 아닌 엔티티를 영속성 컨텍스트라는 곳에 저장하는것 EntityManager.persist(entity);
1. 비영속 상태
: JPA와 관련없음(EntityManager와 상관없음 + 사용하지않음)
// 비영속 상태 Member member = new Member(); member.setId(100L); member.setName("HelloJPA");
2. 영속 상태
: EntityManager 사용 시점부터 영속 상태에 들어감 → 영속성 컨텍스트에 들어감
// 영속 상태 em.persist(member);
3. 준영속, 삭제
: em.detach(member) 실행하면 다시 영속성 컨텍스트에서 나옴
: em.remove()
4. 1차 캐시
JPA는 일단 조회하면 무조건 영속성 컨텍스트에 올려둔다. (같은걸 조회하면 1차캐시에서 찾아옴)
영속성 컨텍스트에 들어가면 바로 DB에 들어가는것이 아닌 1차 캐시에 저장 이 된다.
아래 이미지에서 find를 실행했음에도 select가 실행되지 않는 이유는 DB에서 찾아오는것이 아닌 먼저 1차 캐시에서 검색해왔기 때문!!
// 비영속 상태 Member member = new Member(); member.setId(101L); member.setName("HelloJPA"); // 영속 상태(여기까지는 아직 쿼리를 날리지 않음) em.persist(member); Member findMember = em.find(Member.class, 101L);
5. 엔티티 등록( 트랜잭션을 지원하는 쓰기 지연 )
memberA를 저장(persist) 하면 바로 DB로 쿼리를 날리는게 아니다.
저장하면 1차캐시에서 저장하고 쓰기지연 SQL 저장소에 쿼리를 생성하여 저장해둔다. ( SQL INSERT A, SQL INSERT B 생성된것 확인)
그럼 언제 DB로 날릴까?? transaction.commit 이 실행되면 DB로 쿼리를 날림! 출처 : conatuseus님 블로그-[JPA] 영속성 컨텍스트 #2
6. 엔티티 수정
Member member = em.find(Member.class, 150L); member.setName("ZZZZZ");
from http://eunji-dev.tistory.com/45 by ccl(A) rewrite - 2021-11-09 11:27:28