[Spring] Entity State

thingzoo·2023년 6월 26일
0

Spring

목록 보기
26/54
post-thumbnail

Entity State

Transient(비영속)

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

Managed(영속)

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

예시

  • 비영속 상태
    • entitiesByKey=null
    • 비영속 상태는 JPA가 관리하지 못하기 때문에 해당 객체의 데이터를 변경해도 변경 감지가 이루어지지 않음

  • em.persist(memo); 메서드 호출 후
    • 영속성 컨텍스트에 저장
    • MANAGED 상태 즉, 영속 상태가 됨

Detached(준영속)

  • 준영속 상태: 영속성 컨텍스트에 저장되어 관리되다가 분리된 상태

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

  1. em.detach(memo); : 특정 Entity만 준영속 상태로 전환시킴

    • 영속성 컨텍스트에서 관리되다(Managed)가 분리된 상태(Detached)로 전환됨
    • Entity 객체의 데이터를 수정해도 변경감지 기능을 사용할 수 없어 Update SQL이 수행되지 않음
  2. em.clear(); : 영속성 컨텍스트를 비움

    • 영속성 컨텍스트의 모든 Entity를 준영속 상태로 전환시킴
    • 영속성 컨텍스트 틀은 유지하지만 내용은 비워 새로 만든 것과 같은 상태가 됨
    • 따라서 계속해서 영속성 컨텍스트를 이용 가능
  3. em.close(); : 영속성 컨텍스트를 종료시킴

    • 해당 영속성 컨텍스트가 관리하던 영속성 상태의 Entity들은 모두 준영속 상태로 변경됨
    • 영속성 컨텍스트가 종료되었기 때문에 계속해서 영속성 컨텍스트를 사용할 수 없음

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

  • em.merge(memo); : 전달받은 Entity를 사용하여 새로운 영속 상태의 Entity를 반환
  • 파라미터로 전달된 Entity의 식별자 값으로 영속성 컨텍스트를 조회
    1. 해당 Entity가 영속성 컨텍스트에 없다면?
      1. DB에서 새롭게 조회
      2. 조회한 Entity를 영속성 컨텍스트에 저장
      3. 전달 받은 Entity의 값을 사용하여 병합
      4. Update SQL 수행 (수정)
    2. 만약 DB에서도 없다면 ?
      1. 새롭게 생성한 Entity를 영속성 컨텍스트에 저장
      2. Insert SQL 수행 (저장)

Removed(삭제)

  • em.remove(memo); : 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태(DELETED)로 전환
profile
공부한 내용은 바로바로 기록하자!

0개의 댓글