[SPRING] JPA Entity의 상태

라미·2024년 2월 25일

spring

목록 보기
9/17
post-thumbnail

Entity의 상태


비영속 상태와 영속 상태

EntityManagerFactory emf;
EntityManager em;

emf = Persistence.createEntityManagerFactory("memo"); //EntityManagerFactory 생성
em = emf.createEntityManager(); //EntityManager 생성

// 비영속 상태, jpa가 관리하지 않는 entity 클래스 상태
Memo memo = new Memo(); 
memo.setId(1L);
memo.setUsername("Robbie");

// 영속 상태 persist() 메서드로 JPA 영속성 컨택스트에 저장된다! 이때부터 영속상태!
em.persist(entity)

준영속(detached) 상태

영속성 컨테이너에서 관리하다가 분리된 상태를 말한다.

준영속 상태로 만드는 방법 세가지

  • detach(entity)
  • clear()
  • close()

detach(entity)

특정 entity를 준영속 상태로 만들어 준다.

EntityTransaction et = em.getTransaction();

et.begin();

// 비영속 상태, jpa가 관리하지 않는 entity 클래스 상태
Memo memo = new Memo(); 
memo.setId(1L);
memo.setUsername("Robbie");

// 영속 상태로 만들어주기!
em.persist(entity)

//em.contains(memo) = true / EntityManager.contains() : 해당 엔티티가 컨테이너에 속하는지 확인하는 메서드
System.out.println("em.contains(memo) = " + em.contains(memo)); 

// 준영속 상태로 만들어주기! 더이상 영속성 컨테이너에서 관리하지 않는다!
em.detach(memo);

// em.contains(memo) = false, 더이상 관리하지 않음을 확인
System.out.println("em.contains(memo) = " + em.contains(memo));

// 관리하지 않는 entity의 수정을 시도 결과 -> 아무 변화도 일어나지 않는다
memo.setUsername("Update");
memo.setContents("memo Entity Update");
et.commit();

위 사항으로 알 수 있는 사실, JPA는 영속상태 일때만 변경감지(Dirty checking)가 이루어진다!

clear()

영속성 컨텍스트의 캐시를 완전히 비워버린다. 모든 엔터티가 detached 상태가 된다!

close()

엔티티 매니저 자체를 close(), 엔터티 매니저가 사용 중인 자원들을 해제하고 해당 엔터티 매니저는 더 이상 사용할 수 없게 된다.

merge(entity)

준영속 상태에서 다시 영속 상태로 바꾸는 방법.
merge() 는 저장 or 수정의 동작을 한다.

삭제(Removed)

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

0개의 댓글