-
-
안녕하세요? 오늘은, JPA의 특성 중 하나인, 영속 상태와 준영속 상태에 대해서 알아보도록 하겠습니다.
※ JPA의 영속성과 영속성 컨텍스트/이점과 flush 등의 관련된 내용은, 아래 포스팅을 참조하시길 바라겠습니다.
https://logger-debug.tistory.com/entry/JPA-%EC%98%81%EC%86%8D%EC%84%B1-Flush
영속 상태란?
: 영속성 컨텍스트의 1차캐시에 올라간 상태 (EntityManager가 관리하는 상태) + persist()로 영속성 컨텍스트에 저장한 상태도 영속상태 + find()로 조회를 할 때, 1차캐시에 데이터가 미존재함으로써, DB에서 조회해서 1차캐시에 데이터를 저장한 상태도 영속상태 |
EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명");
EntityManager em = emf.createEntityManager();
Entity entity = em.find(Entity.class, 1L);
// em.find()가 일어 날때, 1차 캐시에 없으므로 DB에서 조회한 엔티티를 1차 캐시에 넣는다. 영속상태가 됐다.
entity.setName("AAAAA");
// setName으로 이름을 바꾸고 커밋 하려니까, Dirty Checking이 일어나서 1차 캐시의 엔티티와 스냅샷이 다른 것을 감지하고 Update 쿼리를 날리게 된다.
transaction.commit();
준영속상태
: 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 상태 (detached) : JPA가 관리하지 않는 객체 |
준영속상태로 만드는 방법
EntityManager.detach(엔티티)
: 특정 엔티티만 준영속 상태로 전환
EntityManager.clear()
: 영속성 컨텍스트를 완전히 초기화
EntityManager.close()
: 영속성 컨텍스트를 종료
EntityManagerFactory emf = Persistence.createEntityManagerFactory("유닛명");
EntityManager em = emf.createEntityManager();
Entity entity = em.find(Entity.class, 1L);
entity.setName("AAAAA");
em.clear();
Entity entity1 = em.find(Entity.class, 1L);
transaction.commit();
안녕하세요? 오늘은, JPA의 특성 중 하나인, 영속 상태와 준영속 상태에 대해서 알아보았습니다.
그럼 오늘도 즐거운 하루 되시길 바라겠습니다.
'프로그래밍 > Back-end' 카테고리의 다른 글
JPA QueryDSL 네이티브SQL JDBC MyBatis (0) | 2024.10.18 |
---|---|
JPA 지연로딩 즉시로딩 (0) | 2024.10.17 |
JPA 지연로딩 즉시로딩 프록시 proxy (0) | 2024.10.17 |
JPA 영속성 전이 CASCADE 고아 객체 (0) | 2024.10.15 |
JPA 영속성 Flush (0) | 2024.10.15 |
JPA 영속성 컨텍스트의 장점에 대하여! (0) | 2024.10.15 |
JPA 영속성과 영속성 컨텍스트에 대하여! (0) | 2024.10.15 |
JPA 데이터 타입과 기본 임베디드 컬렉션에 대하여! (0) | 2024.10.14 |