728x90

비영속 상태(Transient)
Memo memo = new Memo(); // 비영속 상태
memo.setId(1L);
memo.setUsername("Robbie");
memo.setContents("비영속과 영속 상태");
- 쉽게 말하자면 new 연산자를 통해 인스턴스화 된 Entity 객체를 의미합니다.
- 아직 영속성 컨텍스트에 저장되지 않았기 때문에 JPA의 관리를 받지 않습니다.
영속(Managed)
em.persist(memo);
persist(entity) : 비영속 Entity를 EntityManager를 통해 영속성 컨텍스트에 저장하여 관리되고 있는 상태로 만듭니다.
준영속(Detached)
준영속 상태는 영속성 컨텍스트에 저장되어 관리되다가 분리된 상태를 의미합니다.
- 영속 -> 준영속
- 영속 상태의 엔티티가 영속성 컨텍스트에서 분리(detached)
- 영속성 컨텍스트가 제공하는 기능을 사용 못함
준영속 상태로 만드는 방법
- em.detach(entity) 특정 엔티티만 준영속 상태로 전환
- em.clear() 영속성 컨텍스트를 완전히 초기화
- em.close() 영속성 컨텍스트를 종료
준영속 상태에서 다시 영속 상태로 바꾸는 방법
- merge(entity) : 전달받은 Entity를 사용하여 새로운 영속 상태의 Entity를 반환합니다.
- merge(entity) 동작
- 파라미터로 전달된 Entity의 식별자 값으로 영속성 컨텍스트를 조회합니다.
- 해당 Entity가 영속성 컨텍스트에 없다면?
- DB에서 새롭게 조회합니다.
- 조회한 Entity를 영속성 컨텍스트에 저장합니다.
- 전달 받은 Entity의 값을 사용하여 병합합니다.
- Update SQL이 수행됩니다. (수정)
- 만약 DB에서도 없다면 ?
- 새롭게 생성한 Entity를 영속성 컨텍스트에 저장합니다.
- Insert SQL이 수행됩니다. (저장)
- 해당 Entity가 영속성 컨텍스트에 없다면?
- 파라미터로 전달된 Entity의 식별자 값으로 영속성 컨텍스트를 조회합니다.
- 따라서 merge(entity) 메서드는 비영속, 준영속 모두 파라미터로 받을 수 있으며 상황에 따라 ‘저장’을 할 수도 ‘수정’을 할 수도 있습니다.
삭제(Removed)
remove(entity) : 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태로 전환합니다.
'JPA' 카테고리의 다른 글
[JPA] 변경감지 (Dirty Checking) (1) | 2023.07.09 |
---|---|
[JPA] 쓰기 지연 저장소 (0) | 2023.07.09 |
[JPA] 1차 캐시 (0) | 2023.07.09 |
[JPA] 트랜잭션 (0) | 2023.07.09 |
[JPA] 영속성 컨텍스트 (0) | 2023.07.09 |