엔티티는 관계형 데이터베이스에서는 자체적으로 지속될 수 없으며 POJO를 엔티티로 선언하거나 관계형 데이터베이스의 해당 테이블과의 맵핑 및 관계를 정의하기 위해서만 어노테이션이 사용됩니다.
JPA에서 EntityManager 인터페이스는 애플리케이션이 관계형 데이터베이스에서 엔티티를 관리하고 검색할 수 있도록 하기 위해 사용됩니다.
EntityManager는 엔티티 인스턴스의 라이프사이클를 관리하는 API입니다. EntityManager 오브젝트는 지속성 단위에 의해 정의된 엔티티 세트를 관리합니다. 각 EntityManager 인스턴스는 지속성 컨텍스트와 연관됩니다. 지속성 컨텍스트는 특정 엔티티 인스턴스가 EntityManager에 의해 사용 가능으로 설정된 API를 통해 작성, 지속 및 제거되는 범위를 정의합니다. 일부 방식에서는 지속성 컨텍스트가 트랜잭션 컨텍스트와 개념적으로 유사합니다.
엔티티 관리자는 작성된 변경사항 및 업데이트사항에 대해 지속성 컨텍스트에 있는 모든 엔티티 오브젝트를 추적하고 이러한 변경사항을 데이터베이스에 비웁니다. 지속성 컨텍스트가 닫히면 관리되는 모든 엔티티 오브젝트 인스턴스는 지속성 컨텍스트 및 연관된 엔티티 관리자에서 분리되어 더 이상 관리되지 않습니다. 오브젝트가 지속성 컨텍스트에서 분리되면 해당 오브젝트는 더 이상 엔티티 관리자에 의해 관리되지 않으며 이 오브젝트 인스턴스에 대한 상태 변경사항은 데이터베이스와 동기화되지 않습니다.
엔티티 오브젝트 인스턴스는 엔티티 관리자에 의해 관리(접속)되거나 관리되지 않습니다(분리됨).
엔티티가 엔티티 관리자에 접속되면 관리자는 해당 엔티티에 대한 변경사항을 모니터하여 엔티티 관리자가 상태를 비울 때마다 해당 변경사항을 데이터베이스와 동기화합니다.
엔티티가 분리되어 더 이상 지속성 컨텍스트와 연관되지 않는 경우 해당 엔티티는 관리되지 않으며 상태 변경사항은 엔티티 관리자에 의해 추적되지 않습니다.
| 오퍼레이션 | 설명 |
|---|---|
| 지속 |
|
| 찾기 | 지정된 지속적 ID(1차 키)를 가진 관리되는 엔티티 인스턴스를 확보하며 찾을 수 없는 경우 널(null)을 리턴합니다. |
| 제거 | 데이터베이스에서 지정된 지속적 ID를 가진 관리되는 엔티티를 삭제합니다. |
| 병합 | 분리된 엔티티의 상태가 분리된 엔티티의 관리되는 사본에 병합됩니다. 리턴되는 관리되는 엔티티는 분리된 엔티티와 다른 Java™ ID를 가집니다. |
| 새로 고치기 | 데이터베이스에서 엔티티 상태를 다시 로드합니다. |
| 잠금 | 지속성 컨텍스트에 포함된 엔티티 오브젝트에 대해 잠금 모드를 설정합니다. |
| 비우기 | 데이터베이스와 강제로 동기화합니다. |
| 포함 | 엔티티가 현재 지속성 컨텍스트에 포함되는지 판별합니다. |
| createQuery | 동적 Java 지속적 조회 언어를 사용하여 조회 인스턴스를 작성합니다. |
| createNamedQuery | 사전 정의된 조회의 인스턴스를 작성합니다. |
| createNativeQuery | SQL 조회의 인스턴스를 작성합니다. |
Java EE 환경에서 엔티티 관리자를 사용하는 한 가지 방법은 컨테이너 관리 엔티티 관리자를 사용하는 것입니다. 이 모드에서 컨테이너는 엔티티 관리자의 열기 및 닫기를 담당하므로 애플리케이션에 대해 투명한 방식으로 지속적 컨텍스트의 라이프사이클 열기 및 닫기도 담당합니다. 컨테이너 관리 엔티티 관리자는 트랜잭션 경계도 담당합니다.
컨테이너 관리 엔티티 관리자는 JNDI 찾아보기 또는 종속성 삽입을 통해 애플리케이션에서 확보되며 컨테이너는 애플리케이션에 대해 투명하게 엔티티 관리자 팩토리를 사용한 삽입을 관리합니다.
지속성 컨텍스트가 현재 JTA 트랜잭션과 함께 자동으로 전달되므로 컨테이너 관리 엔티티 관리자는 JTA 트랜잭션을 사용해야 하며 동일한 지속성 단위에 맵핑된 엔티티 관리자 참조에서는 JTA 트랜잭션 내의 이 동일한 지속성 컨텍스트에 대한 액세스를 제공합니다. Java EE 컨테이너에 의한 이러한 지속성 컨텍스트의 전달은 애플리케이션이 한 컴포넌트에서 다른 컴포넌트로 엔티티 관리자 인스턴스에 대한 참조를 전달하지 않아도 됨을 의미합니다.
애플리케이션 관리 엔티티 관리자를 사용하면 애플리케이션 코드로 엔티티 관리자를 제어할 수 있습니다.