김영한님이 지음, [자바 ORM 표준 JPA 프로그래밍] 책을 읽고 정리한 필기입니다.📢
준영속
준영속 상태란 엔티티가 영속성 컨텍스트에서 분리된 상태이다. 준영속 상태의 엔티티는 영속성 컨첵스트가 제공하는 기능을 사용할 수 없다.
준영속 상태로 변경하는 방법
em.detach(entity)
: 특정 엔티티만 준영속 상태로 전환한다.em.clear()
: 영속성 컨텍스트를 완전히 초기화한다.em.close()
: 영속성 컨텍스트를 종료한다.
준영속 상태로 전환 : detach()
detach 실행 후
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void testDetached(){
//회원 엔티티 생성, 비영속 상태
Member member = new Member();
member.setId("memberA");
member.setUsername("회원A");
//회원 엔티티 영속 상태
em.persist(member);
//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
em.detach(member);
//트랜잭션 커밋
transaction.commit();
}
플러시가 일어나기 전 준영속 상태로 변경했기 때문에 위 코드는 어떤 일도 일어나지 않음
영속성 컨텍스트 초기화 : clear()
해당 영속성 컨텍스트의 모든 엔티티를 준영속 상태로 만든다.
영속성 컨텍스트 종료 : close()
영속성 컨텍스트가 관리하던 영속 상태의 엔티티가 모두 준영속 상태로 된다.
병합 : merge()
준영속 상태의 엔티티를 다시 영속 상태로 변경한다. 새로운 영속 상태의 엔티티를 반환한다.
파라미터로 넘어온 준영속 엔티티는 병합 후에도 준영속 상태이다.
비영속 엔티티도 영속 상태로 만들 수 있다.
1
2
3
Member member = new Member();
Member newMember = em.merge(member); //비영속 병합
tx.commit(); //가능
병합은 준영속/비영속을 신경쓰지 않음, 식별자 값으로 엔티티를 조회할 수 있다면 불러서 병합하고 그럴수 없다면 새로 생성해서 병합한다. 따라서 병합은 save or update 기능을 수행한다.
준영속 상태의 특징
- 거의 비영속 상태에 가깝다.
- 영속성 컨텍스트가 관리하지 않으므로 1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩을 포함한 어떤 기능도 동작하지 않음
- 식별자 값을 가지고 있다.
- 이미 한 번 영속 상태였으므로 반드시 식별자 값을 가지고 있음
- 지연 로딩을 할 수 없다.
댓글남기기