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