반응형
1.준영속
영속 → 준영속 상태 변화를 알아보자.
준영속 : 영속성 컨텍스트가 관리하는 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)된 것을 준영속 상태라 한다.
- 준영속 상태의 엔티티는 영속성 컨텍스트가 제공하는 기능을 사용할 수 없다.
준영속상태로 만드는 방법
- em.detach(entity) : 특정 엔티티만 준영속 상태로 전환한다.
- em.clear() : 영속성 컨텍스트를 완전히 초기화한다.
- em.close() : 영속성 컨텍스트를 종료한다.
1-1. 엔티티를 준영속 상태로 전환 : detach()
public void testDetached(){
...
// 비영속 상태
Member member = new Member();
member.setId("corn");
member.setUsername("회원A");
// 영속 상태
em.persist(member);
// 영속성 컨텍스트에서 분리(준영속 상태)
em.detach(member);
transaction.commit(); // 커밋
}
이렇게 em.detach(member)를 실행해서 준영속 상태로 만든다는 의미는 엔티티가 영속성 컨텍스트가 관리하지 않는 상태로 만든다는 것을 의미한다.
준영속 상태이므로 영속성 컨텍스트가 지원하는 어떤 기능도 동작하지 않는다.
- 1차 캐시에서 제거됨
- 쓰기 지연 SQL 저장소에 저장되었던 관련 SQL모두 제거
따라서 transaction.commit()이 일어나도 데이터베이스에 저장이 되지 않는다.
1-2. 영속성 컨텍스트 초기화 : clear()
// 영속 상태(엔티티 조회)
Member member = em.find(Member.class, "memberA");
em.clear(); // 영속성 컨텍스트 초기화
// 준영속 상태
member.setUsername("corn2");
em.clear()는 영속 컨텍스트에 있는 모든 것을 초기화 시킨다.(영속성 컨텍스트를 제거하고 새로 만든 것과 같다.)
따라서 memberA는 준영속 상태가 되며, member.setUsername("corn2")가 실행되더라도 영속성 컨텍스트가 관리하지 않는 상태가 되므로 이름을 변경하여도 데이터베이스 반영되지 않는다. (변경감지 동작 x)
1-3. 영속성 컨텍스트 종료 : close()
영속성 컨텍스트를 종료하면 해당 영속성 컨텍스트가 관리하던 영속 상태의 엔티티가 모두 준영속 상태가 된다.
영속성 관리 정리
- 엔티티 매니저를 만들면 그 내부에 영속성 컨텍스트도 함께 만들어 진다. 이 영속성 컨텍스트는 엔티티 매니저를 통해서 접근할 수 있다. (엔티티 매니저는 엔티티 매니저 팩토리에서 생성한다.)
- 영속성 컨텍스트는 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. (1차 캐시, 동일성 보장, 트랜잭션을 지원하는 쓰기 지연(transactional write-behind), 변경 감지(dirty checking), 지연 로딩 기능(lazy loading) 등이 장점)
- 영속성 컨텍스트에 저장한 엔티티는 플러시 시점에 데이터베이스에 반영됨 (일반적으로 트랜잭션이 커밋될 때 영속성 컨텍스트가 플러시된다.)
- 영속성 컨텍스트가 관리하는 엔티티를 영속 상태, 더 이상 관리하지 못하면 준영속 상태 라고 한다. 준영속 상태의 엔티티는 더는 영속성 컨텍스트의 관리를 받지 못하므로 영속성 컨텍스트가 제공하는 1차 캐시, 동일성 보자, 쓰기 지연, 변경 감지, 지연 로딩 같은 기능을 사용할 수 없다.
출처 : 김영한 자바 ORM 표준 JPA 프로그래밍
반응형
'프로그래밍 노트 > JPA' 카테고리의 다른 글
[JPA] 연관관계 매핑 기초(단방향/양방향) (5) | 2019.10.10 |
---|---|
[JPA] 제네릭(generic)한 컨버터(converter) 만들기. Generic Json Converter (0) | 2019.10.10 |
[JPA] 영속성관리_2 (영속성 컨텍스트 특징, 조회, 수정, 삭제) (0) | 2019.09.16 |
[JPA] 영속성 관리_1 (EntityManager, EntityManagerFactory, PersistContext) (0) | 2019.09.03 |
[JPA] 스프링 데이터 JPA 소개 (0) | 2019.09.02 |