Entity
- JPA에서 관리되는 클래스(= 객체)를 의미
- Entity 클래스는 DB의 테이블과 매핑되어 JPA에 의해 관리
- 데이터베이스에 쓰일 필드와 여러 엔티티 간 연관관계를 정의
- 아래 표에서 세로의 열 부분이 Column, 가로의 행 부분이 Entity 객체, 테이블 전체가 Entity임
컬럼 1 |
컬럼 2 |
컬럼 3 |
컬럼 4 |
엔티티 객체 1-1 |
엔티티 객체 1-2 |
엔티티 객체 1-3 |
엔티티 객체 1-4 |
엔티티 객체 2-1 |
엔티티 객체 2-2 |
엔티티 객체 2-3 |
엔티티 객체 2-4 |
- 필드 : 엔티티의 각 Column
- java private Long column1
Entity의 상태
비영속 (Transient)
- new 연산자를 통해 인스턴스화 된 Entity 객체를 의미
- 아직 영속성 컨텍스트에 저장되지 않았기 때문에 JPA의 관리를 받지 않음
영속(Mananged)
- persist(entity) : 비영속 Entity를 EntityManager를 통해 영속성 콘텍스트에 저장하여 관리되고 있는 상태로 만듦
- JPA가 관리하는 영속 상태의 Entity가 됨
준영속(Detached)
- 준영속 상태는 영속성 컨텍스트에 저장되어 관리되다가 분리된 상태를 의미
- 영속 상태에서 준영속 상태로 바꾸는 방법
- detach(entity) : 특정 Entity만 준영속 상태로 전환
- 영속성 컨텍스트에서 관리되다(Managed)가 분리된 상태(Detached)로 전환
- clear() : 영속성 컨텍스트를 완전히 초기화 함
- 영속성 컨텍스트의 모든 Entity를 준영속 상태로 전환
- 영속성 컨텍스트 틀은 유지하지만 내용은 비워 새로 만든 것과 같은 상태가 됨
- 따라서 계속해서 영속성 컨텍스트를 이용할 수 있음
- close() : 영속성 컨텍스트를 종료
- 해당 영속성 컨텍스트가 관리하던 영속성 상태의 Entity들은 모두 준영속 상태로 변경됨
- 영속성 컨텍스트가 종료되었기 때문에 계속해서 영속성 컨텍스트를 사용할 수 없음
- 준영속 상태에서 다시 영속 상태로 바꾸는 방법
- merge(entity) : 전달받은 Entity를 사용하여 새로운 영속 상태의 Entity를 반환
- merge(entity) 동작
- 파라미터로 전달된 Entity의 식별자 값으로 영속성 컨텍스트를 조회함
- 해당 Entity가 영속성 컨텍스트에 없다면?
- DB에서 새롭게 조회함
- 조회한 Entity를 영속성 컨텍스트에 저장
- 전달 받은 Entity의 값을 사용하여 병합함
- Update SQL이 수행됨 (수정)
- 만약 DB에서도 없다면?
- 새롭게 생성한 Entity를 영속성 컨텍스트에 저장함
- Insert SQL이 수행됨 (저장)
- merge(entity) 메서드는 비영속, 준영속 모두 파라미터로 받을 수 있으며 상황에 따라 ‘저장’을 할 수도 ‘수정’을 할 수도 있음
삭제(Remove)
- remove(entity) : 삭제하기 위해 조회해온 영속 상태의 Entity를 파라미터로 전달받아 삭제 상태로 전환