엔티티 매니저를 통해 영속성 컨텍스트(엔티티를 영구 저장하는 환경)에 접근한다.
EntityManager.persist(member); 를 해주면 영속 상태가 된다.
비영속은 객체를 생성한 상태(영속되기 전)
Member member = new Member(200L, "member200");
준영속은 영속성 컨텍스트에 저장되었다가 분리된 상태.
em.detach(member); // 회원 엔티티를 영속성컨텍스트에서 분리, 준영속상태이다.
em.remove(member); // 객제를 삭제한 상태(삭제)
영속 컨텍스트란
Member member1 = new Member(150L, "A");
Member member2 = new Member(160L, "B");
em.persist(member1);
em.persist(member2);
tx.commit();
코드로 보면 em.persist()를 해줄때 바로 데이터베이스에 저장되는것이 아닌 영속 컨텍스트안에 1차 캐시에 저장된다. 저렇게 한번에 모아 놨다가 커밋되는 순간에 모아둔 비영속상태의 엔티티들을 한방에 DB에 넣는다. 엔티티가 여러개가 있어도 같은 공간에 두기 때문에 memberA == memberB는 true가 된다.(동일성 보장)
쓰기 지연 저장소는
Member member = em.find(Member.class, 160L);
member.setName("coco");
tx.commit();
위 코드는 업데이트 하는 로직인데 persist()를 해주지 않았는데도 업데이트가 성공한다.
이유는 1차캐시에 값을 읽어온 최초 시점을 스냅샷으로 찍어놓는다. 이때 commit이 일어나면 엔티티와 스냅샷을 비교해서 변경이 일어난걸 인식하고 update 쿼리를 쓰기지연 sql저장소에 만들어 둔다. 그리고 업데이트 쿼리를 데이터베이스에 flush하고 커밋한다. 이걸 변경감지라고 한다.
'JPA' 카테고리의 다른 글
Embedded Type (0) | 2022.10.19 |
---|---|
테이블 전략 (0) | 2022.10.18 |
mappedBy (0) | 2022.10.18 |
IDENTITY전략 (0) | 2022.10.17 |
JPA 준비 (1) | 2022.10.14 |