김영한님이 지음, [자바 ORM 표준 JPA 프로그래밍] 책을 읽고 정리한 필기입니다.📢

준영속

준영속 상태란 엔티티가 영속성 컨텍스트에서 분리된 상태이다. 준영속 상태의 엔티티는 영속성 컨첵스트가 제공하는 기능을 사용할 수 없다.

준영속 상태로 변경하는 방법

  1. em.detach(entity) : 특정 엔티티만 준영속 상태로 전환한다.
  2. em.clear() : 영속성 컨텍스트를 완전히 초기화한다.
  3. em.close() : 영속성 컨텍스트를 종료한다.

준영속 상태로 전환 : detach()

img-name
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. 거의 비영속 상태에 가깝다.
    • 영속성 컨텍스트가 관리하지 않으므로 1차 캐시, 쓰기 지연, 변경 감지, 지연 로딩을 포함한 어떤 기능도 동작하지 않음
  2. 식별자 값을 가지고 있다.
    • 이미 한 번 영속 상태였으므로 반드시 식별자 값을 가지고 있음
  3. 지연 로딩을 할 수 없다.

JPA 카테고리 내 다른 글 보러가기

댓글남기기