Member member = new Member();
member.setId(3L);
member.setName("HelloC");
Member member = new Member();
member.setId(3L);
member.setName("HelloC");
//영속
em.persist(member);
영속 상태가 된다고 해서 바로 DB에 쿼리가 날아가는 것이 아니라
3. 준영속
4. 삭제
엔티티를 영구 저장하는 환경
영속성 컨텍스트는 내부에 1차 캐시를 들고 있다.
조회할 때 JPA는 우선 1차 캐시에 조회하는 엔티티가 있는지 찾는다. 있으면 그것을 반환하고 없다면 DB에서 가져온 후 1차캐시에 저장하고 그것을 반환한다.
같은 트랜잭션 안에서 영속 엔티티의 동일성을 보장해준다.
엔티티 등록 시 트랜잭션을 지원하는 쓰기 지연이 가능하다. 영속화 할 때 쿼리를 DB에 보내는 것이 아니라 쿼리를 쓰기 지연 SQL 저장소에 보관한 뒤, 트랜잭션을 커밋하는 순간 쿼리를 보낸다.
변경 감지는 아래에서 설명
트랜잭션 커밋을 하면 내부적으로 flush()가 호출된다.
그 후 엔티티와 스냅샷 비교한다.
(1차 캐시 안에는 Id, Entity, 스냅샷이 있다. 스냅샷은 값을 가져온 그 시점의 상태를 스냅샷으로 보관해둔다.)
JPA가 엔티티의 값이 변경되면 트랜잭션이 커밋되는 시점에 스냅샷과 비교한다.
그 후 쓰기 지연 SQL저장소에 UPDATE쿼리를 만들어 저장해둔다. 그리고 그 쿼리를 DB에 반영 한 후 커밋을 날린다.
영속성 컨텍스트의 변경 내용을 DB에 반영하는 것 (영속성 컨텍스트를 비우는 것이 아니다)
플러시가 일어날 때 발생하는 일