twocowsong

준영속 - detach, clear, close 본문

IT/JPA

준영속 - detach, clear, close

WsCode 2022. 5. 7. 09:31

깃허브 정리 URL : https://github.com/sWineTake/jpa.git

 

GitHub - sWineTake/jpa: 자바 ORM 표준 JPA 프로그래밍 - 김영한

자바 ORM 표준 JPA 프로그래밍 - 김영한. Contribute to sWineTake/jpa development by creating an account on GitHub.

github.com

지금까지 엔티티의 비영속 -> 영속 -> 삭제 상태까지 공부했습니다.

이번에는 영속 -> 준영속 상태를 공부하겠습니다.

 

영속 상태란 영속성 컨텍스트가 관리하는 상태입니다.

준영속 상태란 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 상태를 말합니다.

 

따라서 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없습니다.

 

영속 상태의 엔티티를 준영속 상태로 만드는 방법은 크게 3가지 입니다.

 

1. em.detach(entity) : 특정 엔티티만 준영속 상태로 전환합니다.

2. em.celar() : 영속성 컨텍스트를 완전히 초기화합니다.

3. em.close() : 영속성 컨텍스트를 종료합니다.

 


- 엔티티를 준영속 상태로 전환 : detach()

em.detach() 메소드는 특정 엔티티를 준영속 상태로 만듭니다.

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

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

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

tx.commit(); // 트랜잭션 커밋

 

 

member(엔티티)를 영속화한 다음 detach를 호출하여 준영속 상태로 만들었습니다.

이제는 영속성 컨텍스트에게 더는 해당엔티티를 관리하지 말라는것입니다.

detach를 호출하는 순간 1차 캐시부터 쓰기지연 SQL저장소까지 해당 엔티티를 관리하기 위한 모든 정보가 제거됩니다.

 

영속 상태였다가 더는 영속성 컨텍스트가 관리하지 않는 상태를 준영속 상태라고 합니다.

 


- 영속성 컨텍스트 초기화 : clear()

detach가 특정 엔티티 하나를 준영속 상태로 만들었다면 clear는 영속성 컨텍스트를 초기화해서 해당 영속성 컨텍스트의 모든 엔티티를 준영속 상태로 만듭니다.

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

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

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

clear로 인해 영속성 컨텍스트에 있는 모든 것이 초기화가 되었습니다.

이 행동은 영속성 컨텍스트를 제거하고 새로 만든것과 동일한 행동입니다.

준영속 상태에서 영속성 컨텍스트가 지원하는 변경 감지는 동작하지 않습니다. 

따라서 회원이름을 변경하는 setUsername를 호출하여 변경하여도 DB에 반영되지 않습니다.


- 영속성 컨텍스트 초기화 : close()

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

EntityManagerFactory emf =
      Persistence.createEntityManagerFactory("jpa-study");

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();

영속성 컨텍스트가 종료되어서 더이상은 memberA, memberB가 관리되지 않습니다.

 

영속 상태의 엔티티는 주로 영속성 컨텍스트가 종료되면서 준영속 상태로 됩니다.

개발자가 직접 준영속 상태로 만드는 일은 많이없습니다. 

 

'IT > JPA' 카테고리의 다른 글

병합 merge  (0) 2022.05.07
준영속 상태의 특징  (0) 2022.05.07
플러시 모드 옵션  (0) 2022.05.07
플러시  (0) 2022.05.06
엔티티 삭제  (0) 2022.05.05