JPA가 엔터티를 관리하는 공간이다.
DB ⇔ 영속성 컨텍스트 ⇔ 애플리케이션
중간에 존재하는 캐시 공간같은 느낌이다.
JPA 엔터티는 4가지 상태를 가진다.
1. 비영속(Transient)
User user = new User();
객체만 생성된 상태
2. 영속(Persistent)
entityManager.persist(user);
영속성 컨텍스트가 관리하는 상태
3. 준영속(Detached)
entityManager.detach(user);
관리 대상에서 제외
4. 삭제(Removed)
entityManager.remove(user);
삭제 예정 상태
1차 캐시
User user1 = em.find(User.class, 1L);
User user2 = em.find(User.class, 1L);
두 번째 조회는 DB에 접근하지 않는다.
DB조회 ⇒ 영속성 컨텍스트 저장 ⇒ 재사용
이를 1차 캐시라고 한다.
@Transactional
public void updateUser(Long id) {
User user = repository.findById(id).orElseThrow();
user.setName("Kim");
}
save() 없음
하지만 트랜잭션 종료 시
update user
set name = 'Kim'
where id = 1
자동 실행
Flush
영속성 컨텍스트의 변경 내용을 DB에 반영
em.flush();
※ 주의
flush != commit
DB에 SQL만 보내고 트랜잭션은 유지된다.