Member member = new Member();
member.setId("member1");
member.setUserName("회원1");
//1차 캐시에 저장됨
em.persist(member);
//1차 캐시에서 조회
Member findMember = em.find(Member.class, member1); //(1차캐시에 있는 경우 캐시에서 가져옴)
Member findMember = em.find(Member.class, member2); //(1차캐시에 없는 경우 DB에서 가져오고 1차캐시에 저장 )
트랜잭션을 지원하는 쓰기 지연
transaction.begin();
em.persist(memberA); //1차캐시 및 쓰기 지연 SQL 저장소에 Insert쿼리가 저장 됨
em.persist(memberB); //1차캐시 및 쓰기 지연 SQL 저장소에 Insert쿼리가 저장 됨
transaction.commit(); //트랜잭션 커밋 시점에 Insert쿼리 전달
//
//하이버네이트의 옵션을 통해 한번에 쿼리를 보내고 커밋 함 일종의 버퍼링 기능
//hibernate.jdbc.batch_size
엔티티 수정 ( 변경 감지 )
tx.begin();
Member member = em.find(Member.class, 150L);
member.setName("ZZZZ"); //데이터 변경시 업데이트 처리 됨
//em.persist(member) 반영 할 필요 없음
tx.commit();
엔티티 수정 및 감지 순서
Commit시점에 내부적으로 Flush가 일어난다.
1차 캐시 안에는 Id, Entity, 스냅샷을 가지고 있다. 스냅샷이란 최초로 영속성 컨텍스트에 들어온 상태
JPA 영속성 컨텍스트
엔티티의 생명주기
1차 캐시
영속성 컨텍스트에는 1차 캐시를 가지고 있다. ( 한 트랜잭션 안에서만 유효함 )
트랜잭션을 지원하는 쓰기 지연
엔티티 수정 ( 변경 감지 )
엔티티 수정 및 감지 순서