반응형
영속성 컨텍스트 : 엔티티를 영구 저장하는 환경
예제 1. insert 로직에서의 영속성과 1차 캐시
아래 예제는 모두 하나의 Transaction안에서만 유효함
/// 1. 비영속 상태 ( 영속성 컨텍스트와 전혀 관계없는 상태)
User user = new User();
user.setId(1L);
user.setName("myname");
user.setPhone("01012341234");
/// 2. 영속 상태 (영속성 컨텍스트에 포함되면서 영속상태가 됨)
EntityManager em = emf.createEntityManager();
em.getTransation().begin();
em.persist(user);
/// 3. 1차 캐시에서 조회
/// - 영속성 컨텍스트안에서 움직였던 데이터라면 영속성 컨텍스트안의 1차 캐시에서 데이터 조회
/// - DB에 쿼리가 실행되지 않음
User findUser = em.find(User.class, 1L);
/// 3.1 id가 2번인 user를 검색하려할때는 영속성 컨텍스트안에 없던 데이터니 쿼리로 DB에서 조회함
/// DB에서 조회한 값을 영속성 컨텍스트의 1차 캐시에 저장하고 최종적으로 1차 캐시에서 2번 id의 값을 가져옴
User findUser = em.find(User.class, 2L);
예제 2. insert 로직에서의 쓰기지연
User user = new User();
user.setId(1L);
user.setName("myname");
user.setPhone("01012341234");
User user2 = new User();
user.setId(2L);
user.setName("myname2");
user.setPhone("01098765443");
EntityManager em = emf.createEntityManager();
em.getTransation().begin();
em.persist(user);
em.persist(user2);
System.out.println("여기까지는 insert query가 실행되지 않음");
System.out.println("쓰기 지연 저장소에 저장해두고 있는 상태");
em.getTransation().commit();
System.out.println("transaction이 끝난 상태에서 insert query가 한방에 나감");
예제 3. update 로직에서의 변경 감지
/// 1. find했을때 jpa는 find했을 당시의 상태를 스냅샷으로 가지고있음
User findUser = em.find(User.class, 1L);
/// 2. entity를 변경한다고 update쿼리가 나가지 않음
findUser.setName("testname");
Sysmtem.out.println("commit 하기 전까지 update쿼리가 나가지 않음");
/// commit 시점에 처음 저장했던 스냅샷과 현재의 entity를 비교해서 update쿼리를 만들어서 실행시킴
transaction.commit();
반응형
'JPA' 카테고리의 다른 글
Proxy형태로 동작하는 JPA @Transactional (8) | 2021.02.10 |
---|---|
[JPA] OneToOne 성능 튜닝 사례 1 (1) | 2020.08.18 |
JPQL과 영속성 컨텍스트의 관계 (1) | 2020.07.17 |
MultipleBagFetchException과 default_batch_fetch_size (0) | 2020.07.13 |
LazyInitializationException- no session(준영속상태에서의 참조) (0) | 2020.07.11 |