Member member = new Member();
member.setId("member1");
member.setUsername("회원1")
// 객체를 생성한 상태 (비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1")
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
//객체를 저장한 상태 (영속)
em.persist(member);
// 회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);
// 객체를 삭제한 상태(삭제)
em.remove(member);
1차 캐시
- 영속성 컨텍스트는
내부에 캐시를 가지고 있는데
이것을1차 캐시
라고 한다.영속 상태의 엔티티는 모두 이곳에 저장된다.- em.find()를 호출하면 우선 1차 캐시에서 식별자 값으로 엔티티를 찾는다. 만약 찾는 엔티티가 있으면 데이터베이스에서 조회하지않고, 메모리에 있는 1차 캐시에서 엔티티를 조회한다!
커밋할 때 모아둔 쿼리를 데이터베이스에 보내는데
이것을 트랜잭션을 지원하는 쓰기 지연
이라고 한다.Member member =em.find(Member.class,150L);
member.setName("TEST");
tx.commit();
member.setName("TEST");
만 추가하면 수정이 된다.
em.update(member); 이런 코드가 있어야 수정이 되지않을까? 싶지만 사용하지 않는다.
📌 변경감지 (Dirty Checking)
엔티티의 변경사항을 데이터베이스에 자동으로 반영하는 기능
JPA는 엔티티를 영속성 컨텍스트에 보관할 때, 최초의 상태를 복사해서 저장해두는데 이것을 스냅샷
이라고 한다. 그리고 플러시 시점에 스냅샷과 엔티티를 비교해서 변경된 엔티티를 찾는다.
- 트랜잭션 커밋하면 엔티티 매니저 내부에서 먼저 플러시(flush)가 호출된다.
- 엔티티와 스냅샷을 비교해서 변경된 엔티티를 찾는다.
- 변경된 엔티티가 있으면 수정 쿼리 생성해서 쓰기 지연 SQL 저장소에 보낸다.
- 쓰기지연 저장소의 SQL을 데이터베이스에 보낸다.
- 데이터베이스 트랜잭션을 커밋한다.