영속성 관리
엔티티에는 4가지 상태가 존재한다.
1. 비영속(new / transient) : 영속성 컨텍스트와 전혀 관계가 없는 상태
2. 영속(managed) : 영속성 컨텍스트에 저장된 상태
3. 준영속(detached) : 영속성 컨텍스트에 저장되었다가 분리된 상태
4. 삭제(removed) : 삭제된 상태
비영속
- 엔티티 객체를 생성했다. 지금은 순수한 객체상태이며, 아직 저장하지 않았다.
- 따라서 영속성 컨텍스트나 데이터베이스와는 전혀 관계가 없다. 이것을 비영속 상태라고 한다.
//객체를 생성한 상태(비영속)
Member member = new Member();
member.setId("member1");
member.setUsername("회원1");
영속
- 엔티티 매니저를 통해 엔티티를 영속성 컨텍스트에 저장하면 영속 상태라 한다.
- 결국 영속 상태라는 것은 엔티티 컨텍스트에 의해 관리되는 상태라는 것.
준영속
- 영속성 컨텍스트가 관리하던 엔티티를 더이상 관리하지 않으면 준영속 상태가 된다.
- 영속 상태의 특정 엔티티를 em.detach(), em.close(), em.clear()를 통해 준영속상태로 변경 할 수 있다.
삭제
- 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제한다.
rm.remove(member);
영속성 컨텍스트의 특징
1. 영속성 컨텍스트와 식별자 값
- 영속성 컨텍스트는 엔티티를 식별자값(@Id로 테이블 기본키와 맵핑항 값)으로 구분한다.
- 따라서 영속상태는 식별자 값이 반드시 있어야함. 만약 없다면 예외가 발생한다.
2. 영속성 컨텍스트와 데이터베이스 저장
- JPA는 보통 트랜잭션을 커밋하는 순간 영속성 컨텍스트에 새로 저장된 엔티티를 데이터베이스에 반영한다.
- 이를 플러시(flush)라고 함.
3. 영속성 컨텍스트가 엔티티를 관리함으로써 생기는 장점
- 1차 캐시
- 동일성 보장
- 트랜잭션을 지원
- 변경 감지
- 지연로딩
'Java' 카테고리의 다른 글
Lambda Expression, 람다 예제 (0) | 2017.01.05 |
---|---|
String StringBuffer StringBuilder 차이 (2) | 2016.12.27 |
Spring DI와 IoC [ Dependency Injection + Inversion of Control ] 요약 (0) | 2016.12.23 |
String 객체에 대한 개념 (0) | 2016.10.12 |
제네릭이란? 제네릭(generic) 예제 (0) | 2016.06.01 |