본문 바로가기
프로그래밍/Back-end

JPA 영속성 영속상태와 준영속상태

by @GodWin 2024. 10. 15.

-

 

-
안녕하세요? 오늘은, JPA의 특성 중 하나인, 영속 상태 준영속 상태에 대해서 알아보도록 하겠습니다.

※ JPA의 영속성과 영속성 컨텍스트/이점과 flush 등의 관련된 내용은, 아래 포스팅을 참조하시길 바라겠습니다.

https://logger-debug.tistory.com/entry/JPA-%EC%98%81%EC%86%8D%EC%84%B1%EA%B3%BC-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

JPA 영속성과 영속성 컨텍스트에 대하여!

- -안녕하세요? 오늘은 JPA에서 가장 중요한 개념인, 영속성에 관련해서 알아보도록 하겠습니다.JPA를 공부할 때 가장 중요한 점은,1. 객체와 관계형 데이터베이스를 매핑하는 것(Object Relational Mapp

logger-debug.tistory.com

https://logger-debug.tistory.com/entry/JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EC%9D%98-%EC%9E%A5%EC%A0%90%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC

 

JPA 영속성 컨텍스트의 장점에 대하여!

- -안녕하세요? 오늘은, JPA에서 가장 중요한 개념인, 영속성에서 더 나아가서, 영속성 컨텍스트의 이점에 대해서 알아보도록 하겠습니다.※ JPA의 영속성과 영속성 컨텍스트에 대해서는, 아래 포

logger-debug.tistory.com

https://logger-debug.tistory.com/entry/JPA-%EC%98%81%EC%86%8D%EC%84%B1-Flush

 

JPA 영속성 Flush

- -안녕하세요? 오늘은, 이전 포스팅에서 다뤘던, 영속성 컨텍스트의 이점 중에서, 1차캐시 중, 트랜잭션의 commit 시점에서, 내부적으로 이루어지는 flush에 대해서 알아보도록 하겠습니다.※ JPA

logger-debug.tistory.com

 

영속 상태란?

 

: 영속성 컨텍스트의 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의 특성 중 하나인, 영속 상태 준영속 상태에 대해서 알아보았습니다.
그럼 오늘도 즐거운 하루 되시길 바라겠습니다.