-
Notifications
You must be signed in to change notification settings - Fork 1
Open
Labels
Description
엔티티 매니저 팩토리와 엔티티 매니저
-
엔티티 매니저 팩토리는 Thread-Safe
-
엔티티 매니저는 Non-Thread-Safe
-
https://iyoungman.github.io/jpa/EntityManagerFactory-EntityManager-PersistenceContext/
-
https://medium.com/@SlackBeck/jpa-entitymanager%EC%99%80-%EB%8F%99%EC%8B%9C%EC%84%B1-e30f841fcdf8
-
엔티티 매니저는 DB 연결이 필요한 시점에 DB 커넥션을 얻는다.
-
컨테이너 기반에서 JPA를 사용할 경우 EntityManagerFactory 생성 시점에 DB 커넥션풀도 만든다.
엔티티 생명주기
- 컨테이너 기반에서 준영속 상태 언제될까?
- 영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않는것
- https://conservative-vector.tistory.com/entry/%EC%97%90%EB%9F%ACdetached-entity-passed-to-persist-orgrefrigeratorspringbootdomainrecipeFood-nested-exception-is-orghibernatePersistentObjectException
- https://xebia.com/blog/jpa-implementation-patterns-saving-detached-entities/
영속성 컨텍스트 특징
-
식별자
- 엔티티 식별자 값으로 구분한다.
- 따라서 영속 상태는 식별자 값이 반드시 있어야 한다.
-
영속성 컨텍스트 -> DB 저장 시점
- 트랜잭션 커밋 시점
- 이를 flush(DB에 반영) 라고 한다.
-
영속 엔티티가 동일성 보장하는 이유
- find하면 1차 캐시 조회 -> DB 조회를 한다.
- 만약 1차 캐시에 없으면 DB 조회한 결과를 1차 캐시에 저장한다.
- 1차 캐시는 Map 자료구조이다.
- Map의 Key는 객체 식별자, Value는 객체 인스턴스
- 아래의 경우 1차 캐시 Map에서 조회하므로 true
Member m1 = em.find(Member.class, "member1"); Member m2 = em.find(Member.class, "member1"); m1 == m2//true, 동일성
-
변경 감지 과정
플러시
- 영속성 컨텍스트 변경 내용을 DB에 반영
geonyeongkim and wwlee94