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(준영속)
- 준영속 상태: 영속성 컨텍스트에 저장되어 관리되다가 분리된 상태
영속 상태에서 준영속 상태로 바꾸는 방법
-
em.detach(memo);
: 특정 Entity만 준영속 상태로 전환시킴
- 영속성 컨텍스트에서 관리되다(Managed)가 분리된 상태(Detached)로 전환됨
- Entity 객체의 데이터를 수정해도 변경감지 기능을 사용할 수 없어 Update SQL이 수행되지 않음
-
em.clear();
: 영속성 컨텍스트를 비움
- 영속성 컨텍스트의 모든 Entity를 준영속 상태로 전환시킴
- 영속성 컨텍스트 틀은 유지하지만 내용은 비워 새로 만든 것과 같은 상태가 됨
- 따라서 계속해서 영속성 컨텍스트를 이용 가능
-
em.close();
: 영속성 컨텍스트를 종료시킴
- 해당 영속성 컨텍스트가 관리하던 영속성 상태의 Entity들은 모두 준영속 상태로 변경됨
- 영속성 컨텍스트가 종료되었기 때문에 계속해서 영속성 컨텍스트를 사용할 수 없음
준영속 상태에서 다시 영속 상태로 바꾸는 방법
em.merge(memo);
: 전달받은 Entity를 사용하여 새로운 영속 상태의 Entity를 반환
- 파라미터로 전달된 Entity의 식별자 값으로 영속성 컨텍스트를 조회
- 해당 Entity가 영속성 컨텍스트에 없다면?
- DB에서 새롭게 조회
- 조회한 Entity를 영속성 컨텍스트에 저장
- 전달 받은 Entity의 값을 사용하여 병합
- Update SQL 수행 (수정)
- 만약 DB에서도 없다면 ?
- 새롭게 생성한 Entity를 영속성 컨텍스트에 저장
- Insert SQL 수행 (저장)
Removed(삭제)
em.remove(memo);
: 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태(DELETED)로 전환