개발자꿈나무
준영속 본문
★ 준영속
- 영속성 컨텍스트가 관리하는 영속 상태의 엔티티가 영속성 컨텍스트에서 분리된 것!
- 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없음
★ 준영속 상태로 만드는 방법
- 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
'자바 > JPA' 카테고리의 다른 글
데이터베이스 스키마 자동 생성 (0) | 2023.07.25 |
---|---|
객체와 테이블 매핑 (0) | 2023.07.25 |
플러시 (0) | 2023.07.23 |
영속성 컨텍스트의 장점 (0) | 2023.07.23 |
엔티티 매니저 팩토리, 엔티티 매니저, 영속성 컨텍스트, 생명주기 (0) | 2023.07.09 |