Flèche
[JPA]영속성컨텍스트2 본문
영속성 컨텍스트와 1차 캐쉬
1차 캐시 : 영속성 컨텍스트는 내부에 캐시를 가지고 있는데 이것을 1차 캐시라 한다.
영속 상태의 엔티티는 모두 이곳에 저장된다. 쉽게 말해 영속성 컨텍스트 내부에 Map이 하나 있는데 (1차 캐시), 키는 @Id로 매핑한 식별자고
값은 엔티티 인스턴스다.em.find()
를 호출했는데 엔티티가 1차 캐시에 없으면 엔티티 매니저는 데이터베이스를 조회해서
엔티티를 생성하고 1차 캐시에 저장한 후에 영속 상태의 엔티티를 반환한다.
영속성 컨텍스트의 쓰기지현
- 엔티티 매니저는 트랜잭션을 커밋하기 직전까지 데이터베이스에 엔티티를 저장하지 않고 내부 쿼리 저장소에 INSERT SQL을 모아둔다.
그리고 트랜잭션을 커밋할 때 모아둔 쿼리를 데이터베이스에 보내서 저장시킨다.
이를 트랜잭션을 지원하는 쓰기 지연이라 한다.
더티체킹
Member memberA = em.find(Member.class, "memberA");
memberA.setUsername("hi");
memberA.setAge(10);
- memberA 객체의 멤버가 변경되면 JPA가 자동으로 update쿼리를 작성한다.
영속성 컨텍스트에서 준영속 상태로
em.flush(), em.clear()
를 하면 DB에 데이터를 반영하고, 영속성 컨텍스트를 지웁니다.
그러면 em.find()를 호출하면 영속성 컨텍스트에 없으니 DB에서 조회하고, 조회 쿼리를 볼 수 있습니다.
실제로 em.flush(), em.clear()를 직접 호출하는 경우는 거의 없다고한다.
em.detach(member)
준영속 상태로 변경em.clear()
영속성 컨텍스트를 초기화시킴 => 더티체킹이 작동Xem.close()
모든 영속성 컨텍스트의 내용을 준영속으로 만듦
'spring' 카테고리의 다른 글
[JPA]영속성컨텍스트1 (0) | 2021.04.04 |
---|---|
[http]메세지 바디와 엔티티 바디의차이 (0) | 2021.03.20 |
[테스트코드] getForEntity getForObject (0) | 2021.03.09 |
[테스트코드]httpentity, testresttemplate.exchange (0) | 2021.03.08 |
[http] put과 post/http헤더와 바디_get방식과 post방식 (0) | 2021.03.06 |