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)
영속성 컨테이너에서 관리하다가 분리된 상태를 말한다.
준영속 상태로 만드는 방법 세가지
특정 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)가 이루어진다!
영속성 컨텍스트의 캐시를 완전히 비워버린다. 모든 엔터티가 detached 상태가 된다!
엔티티 매니저 자체를 close(), 엔터티 매니저가 사용 중인 자원들을 해제하고 해당 엔터티 매니저는 더 이상 사용할 수 없게 된다.
준영속 상태에서 다시 영속 상태로 바꾸는 방법.
merge() 는 저장 or 수정의 동작을 한다.
remove(entity) : 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태로 전환합니다.