개발자꿈나무

준영속 본문

자바/JPA

준영속

망재이 2023. 7. 23. 19:21

★ 준영속

- 영속성 컨텍스트가 관리하는 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 것!

- 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없음

 

★ 준영속 상태로 만드는 방법

  • em.detach(entity) : 특정 엔티티만 준영속 상태로 만듦
  • em.clear() : 영속성 컨텍스트를 완전히 초기화 시킴
  • em.close() : 영속성 컨텍스트를 종료함

 

⭐︎ 엔티티를 준영속 상태로 전환

//회원 엔티티 생성, 비영속 상태
Member member = new Member();
member.setId("memberA");
member.setUsername("회원A");

//회원 엔티티 영속 상태
em.persist(member);

//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);

tx.commit();

- em.persist()를 통해서 영속 상태로 등록하며 1차 캐시와 쓰기 지연 SQL 저장소에 INSERT쿼리가 들어가있었지만 detach()를 호출하며 준영속 상태로 만듦 -> 1차 캐시에 들어있던 member엔티티와 쓰기 지연 SQL 저장소에 있던 INSERT쿼리 삭제

 

 

⭐︎ 영속성 컨텍스트 초기화

//엔티티 조회, 영속 상태
Member member = em.find(Member.class, "memberA");

em.clear(); //영속성 컨텍스트 초기화

//준영속 상태
member.setUsername("detach");

- 1차 캐시에 들어있던 memberA 엔티티를 em.clear()를 호출하면서 초기화 시킴 -> 특정 엔티티만 초기화시키는게 아니라 영속성 컨텍스트에 있는 모든 엔티티를 초기화 시킴 -> 영속성 엔티티에는 영속 상태의 엔티티가 존재하지 않으므로 member.setUsername()을 해도 변경 감지가 동작되지 않음

 

 

⭐︎ 영속성 컨텍스트 종료

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();

EntityTransaction tx =  em.getTransaction();

tx.begin(); //트랜젝션 시작

Member memberA = em.find(Member.class, "memberA");
Member memberB = em.find(Member.class, "memberB");

tx.commit();

em.close(); //영속성 컨텍스트 닫기(종료)

- 영속성 컨텍스트를 종료하면 해당 영속성 컨텍스트가 관리하던 영속 상태의 엔티티가 모두 준영속 상태가 됨

 

 

* 주로 영속성 컨텍스트가 종료되면서 준영속 상태가 되는 경우가 많음. 직접 준영속 상태로 만드는 일은 드물다!

728x90