개발/JPA

Entity 생명주기

낭곰 2022. 7. 5. 15:32
반응형

 

 

Entity에는 4가지의 상태가 존재합니다.

  • 비영속(new/transient): 영속성 컨텍스트와 전혀 관계가 없는 상태
  • 영속(managed): 영속성 컨텍스트에 저장된 상태
  • 준영속(detached): 영속성 컨텍스트에 저장되었다가 분리된 상태
  • 삭제(removed): 삭제된 상태

 

Entity 생명 주기

 

 

 

비영속

엔티티 객체를 생성만 한 순수한 객체 상태이며 아직 저장하지 않은 상태, 따라서 영속성 컨텍스트나 데이터베이스와는 전혀 관련이 없습니다. 이것을 비영속상태라 합니다.

 

//객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUserName("회원1");

 

비영속 상태

 

 

 

영속

엔티티 매니저를 통해서 엔티티를 영속성 컨텍스트에 저장합니다. 이렇게 영속성 컨텍스트가 관리하는 엔티티를 영속 상태라 합니다. 결국 영속 상태라는 것은 영속성 컨텍스트에 의해 괸리된다는 뜻입니다.

그리고 entityManager.find()나 JPQL을 사용해서 조회한 엔티티도 영속성 컨텍스트가 관리하는 영속상태입니다.

영속 상태

 

 

 

 

준영속

영속성 컨텍스트가 관리하던 영속 상태의 엔티티를 영속성 컨텍스트가 관리하지 않으면 준영속 상태가 됩니다. 특정 엔티티를 준영속 상태로 만들려면 entityManager.detach()를 호출하면 됩니다. entityManager.close()를 호출해서 영속성 컨텍스트를 닫거나 entityManager.clear()를 호출해서 영속성 컨텍스트를 초기화해도 영속성 컨텍스트가 관리하던 영속 상태의 엔티티는 준영속 상태가 됩니다.

 

//회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
entityManager.detach(member);
  • entityManager.detach(entity) : 특정 엔티티만 준영속 상태로 전환한다.
  • entitymanager.clear() : 영속성 컨텍스트를 완전히 초기화한다.
  • entityManager.close() : 영속성 컨텍스트를 종료한다.

 

detach() 메서드

public void testDetach() {
	...
    //회원 엔티티 생성, 비영속 상태
    Member member = new Member();
    member.setId("memberA");
    member.setUsername("회원A");
    
    //회원 엔티티 영속 상태
    entityManager.persist(member);
    
    //회원 엔티티를 영속성 컨텍스트에서 분리, 준영속 상태
    entityManager.detach(member);
    
    transaction.commit(); //트랜잭션 커밋


}

 

 

deach 실행 전

 

 

detach 실행 후

 

 

삭제

엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제합니다.

//객체를 삭제한 상태(삭제)
entityManager.remove(member);

 

 

 

참고 : 자바 ORM 표준 JPA 프로그래밍(김영한 저)

반응형