JPA

[JPA] Entity의 상태

개발 공주 2023. 7. 9. 19:26
728x90

엔티티 생명 주기

비영속 상태(Transient)

Memo memo = new Memo(); // 비영속 상태
memo.setId(1L);
memo.setUsername("Robbie");
memo.setContents("비영속과 영속 상태");
  • 쉽게 말하자면 new 연산자를 통해 인스턴스화 된 Entity 객체를 의미합니다.
  • 아직 영속성 컨텍스트에 저장되지 않았기 때문에 JPA의 관리를 받지 않습니다.

영속(Managed)

em.persist(memo);

persist(entity) : 비영속 Entity를 EntityManager를 통해 영속성 컨텍스트에 저장하여 관리되고 있는 상태로 만듭니다.


준영속(Detached)

준영속 상태는 영속성 컨텍스트에 저장되어 관리되다가 분리된 상태를 의미합니다.

  • 영속 -> 준영속
  • 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
  • 영속성 컨텍스트가 제공하는 기능을 사용 못함

준영속 상태로 만드는 방법

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

준영속 상태에서 다시 영속 상태로 바꾸는 방법

  • merge(entity) : 전달받은 Entity를 사용하여 새로운 영속 상태의 Entity를 반환합니다.
  • merge(entity) 동작
    • 파라미터로 전달된 Entity의 식별자 값으로 영속성 컨텍스트를 조회합니다.
      1. 해당 Entity가 영속성 컨텍스트에 없다면?
        1. DB에서 새롭게 조회합니다.
        2. 조회한 Entity를 영속성 컨텍스트에 저장합니다.
        3. 전달 받은 Entity의 값을 사용하여 병합합니다.
        4. Update SQL이 수행됩니다. (수정)
      2. 만약 DB에서도 없다면 ?
        1. 새롭게 생성한 Entity를 영속성 컨텍스트에 저장합니다.
        2. Insert SQL이 수행됩니다. (저장)
  • 따라서 merge(entity) 메서드는 비영속, 준영속 모두 파라미터로 받을 수 있으며 상황에 따라 ‘저장’을 할 수도 ‘수정’을 할 수도 있습니다.

삭제(Removed)

remove(entity) : 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태로 전환합니다.

'JPA' 카테고리의 다른 글

[JPA] 변경감지 (Dirty Checking)  (1) 2023.07.09
[JPA] 쓰기 지연 저장소  (0) 2023.07.09
[JPA] 1차 캐시  (0) 2023.07.09
[JPA] 트랜잭션  (0) 2023.07.09
[JPA] 영속성 컨텍스트  (0) 2023.07.09