준영속(detached)

신상현·2021년 2월 2일
0

Spring Boot와 JPA

목록 보기
7/16

영속성 컨텍스트에 영속되어있다가 분리되는 것이다.


준영속(detached)이 되는 법

1. em.detach(entity)

  • 특정 엔티티 객체를 영속성 컨텍스트로부터 분리시킨다.
  • 1차 캐시, 쓰기 지연 SQL 저장소에 해당 엔티티와 관련된 정보가 제거

2. em.clear()

  • 영속성 컨텍스트의 모든 엔티티의 정보를 초기화한다.
  • 모든 엔티티들은 준영속 상태가 되므로, 영속 상태의 기능을 지원 받지 못한다.

3. em.close()

  • 영속성 컨텍스트를 종료한다.

준영속 상태 특징

  • 비영속 상태에 가깝다
  • 영속 상태에서 변화한 것이기 때문에, 식별자 값을 갖고 있다!
  • 지연 로딩을 할 수가 없다.

병합: Merge()

비영속, 준영속 상태의 엔티티를 다시 영속 상태로 만드는 것이다.
새로운 영속 상태의 엔티티를 반환한다.
save Or update의 기능을 한다.

  1. 비영속, 준영속 상태의 membername을 수정한다.

  2. em2.merge(member)가 호출된다.

  3. 1차 캐시에서 member의 식별자 값으로 찾는다.

  4. 없으면 DB에서 조회 후, em2의 1차 캐시에 영속시킨다.

  5. 비영속, 준영속 상태의 member의 값을 mergeMember의 값에 업데이트 시킨다.

    • member의 상태가 준영속 -> 영속이 되는 것이 아니다.
    • 새로운 mergeMeber가 생성되고 값이 업데이트 되는 것이다.
    • member 엔티티 객체는 여전히 준영속 상태이다.
    • member = em2.merge(member) 처럼 기존 준영속 변수를 할당하는 것이 좋다!
  6. mergeMember의 merge된 새로운 엔티티가 반환된다.


profile
개발자 싱상형

0개의 댓글