엔티티 관리자

EntityManager 인터페이스는 엔티티 인스턴스의 라이프사이클을 관리하는 API입니다.

엔티티는 관계형 데이터베이스에서는 자체적으로 지속될 수 없으며 POJO를 엔티티로 선언하거나 관계형 데이터베이스의 해당 테이블과의 맵핑 및 관계를 정의하기 위해서만 어노테이션이 사용됩니다.

JPA에서 EntityManager 인터페이스는 애플리케이션이 관계형 데이터베이스에서 엔티티를 관리하고 검색할 수 있도록 하기 위해 사용됩니다.

EntityManager는 엔티티 인스턴스의 라이프사이클을 관리하는 API입니다. EntityManager 오브젝트는 지속성 단위에서 정의하는 엔티티 세트를 관리합니다. 각 EntityManager 인스턴스는 지속성 컨텍스트와 연관됩니다. 지속성 컨텍스트는 특정 엔티티 인스턴스가 EntityManager에 의해 사용 가능으로 설정된 API를 통해 작성, 지속, 제거되는 범위를 정의합니다. 일부 방식에서는 지속성 컨텍스트가 트랜잭션 컨텍스트와 개념적으로 유사합니다.

엔티티 관리자는 수행된 변경사항과 업데이트가 있는지, 지속성 컨텍스트 내 모든 엔티티 오브젝트를 추적하고 데이터베이스로 이러한 변경사항을 비웁니다. 지속성 컨텍스트가 닫히면 관리되는 모든 엔티티 오브젝트 인스턴스는 지속성 컨텍스트 및 연관된 엔티티 관리자에서 분리되어 더 이상 관리되지 않습니다. 오브젝트가 지속성 컨텍스트에서 분리되면 해당 오브젝트는 더 이상 엔티티 관리자에 의해 관리되지 않으며 이 오브젝트 인스턴스에 대한 상태 변경사항은 데이터베이스와 동기화되지 않습니다.

관리되는 엔티티 및 관리되지 않는 엔티티

엔티티 오브젝트 인스턴스는 엔티티 관리자에 의해 관리(접속)되거나 관리되지 않습니다(분리됨).

엔티티가 엔티티 관리자에 접속되면 관리자는 해당 엔티티에 대한 변경사항을 모니터하여 엔티티 관리자가 상태를 비울 때마다 해당 변경사항을 데이터베이스와 동기화합니다.

엔티티가 분리되어 더 이상 지속성 컨텍스트와 연관되지 않는 경우 해당 엔티티는 관리되지 않으며 상태 변경사항은 엔티티 관리자에 의해 추적되지 않습니다.

트랜잭션 범위 또는 확장된 지속성 컨텍스트가 종료되면 엔티티 인스턴스는 관리되지 않고 분리됩니다. 이 사실로 인한 중요한 결과는 분리된 엔티티가 직렬화되어 네트워크를 통해 원격 클라이언트로 송신될 수 있다는 점입니다. 클라이언트는 이러한 직렬화된 오브젝트 인스턴스에 대해 원격으로 변경사항을 작성한 후 서버로 다시 송신하여 데이터베이스와 다시 병합되고 동기화되도록 할 수 있습니다.

참고: 이 동작은 EJB 2.1 엔티티 모델과 다릅니다. 이 경우 엔티티는 항상 컨테이너에서 관리됩니다. EJB 3.0에서는 POJO인 엔티티에 대해 작업하므로 사용자는 비즈니스 로직 계층(세션 Bean)과 지속성 계층 사이에 패턴(예: DTO(Data Transfer Object))을 사용하도록 강요되지 않기 때문에 이를 통해 Java™ EE 애플리케이션을 디자인하는 방법을 단순화할 수 있습니다.

엔티티 관리자 오퍼레이션

엔티티 관리자가 수행할 수 있는 기본 오퍼레이션:
표 1. 엔티티 관리자 오퍼레이션. 표에서는 엔티티 관리자 오퍼레이션을 설명합니다.
오퍼레이션 설명
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 컨테이너에 의한 이러한 지속성 컨텍스트의 전달은 애플리케이션이 한 컴포넌트에서 다른 컴포넌트로 엔티티 관리자 인스턴스에 대한 참조를 전달하지 않아도 됨을 의미합니다.

컨테이너 관리 지속성 컨텍스트는 다음과 같은 서로 다른 2개의 범위 중 하나를 보유하도록 정의될 수 있습니다.
  • 트랜잭션 지속성 범위
  • 확장 지속성 범위

애플리케이션 관리 엔티티 관리자

애플리케이션 관리 엔티티 관리자를 사용하면 애플리케이션 코드로 엔티티 관리자를 제어할 수 있습니다.

이러한 애플리케이션 관리 엔티티 관리자를 사용하는 경우 다음 사항에 유의하십시오.
  • 애플리케이션 관리 엔티티 관리자를 사용할 때 지속성 컨텍스트는 애플리케이션 컴포넌트로 전파되지 않으며, 엔티티 관리자 인스턴스의 라이프사이클은 애플리케이션에서 관리됩니다. 이는 지속성 컨텍스트가 특정 지속성 단위의 엔티티 관리자 인스턴스에 JTA 트랜잭션과 함께 전달되지 않음을 의미합니다.
  • 애플리케이션에 의해 엔티티 관리자 및 연관된 지속성 컨텍스트가 작성되어 명시적으로 삭제됩니다.
이 유형의 엔티티 관리자는 다음과 같이 서로 다른 2개의 시나리오에서 사용됩니다.
  • Java SE 환경(독립형이며 지정된 지속성 단위에 대한 엔티티 관리자 참조에 JTA 트랜잭션과 함께 전달되지 않는 지속성 컨텍스트에 액세스하려는 경우).
  • Java EE 컨테이너 내부에서 엔티티 관리자 라이프사이클에 대한 매우 세분화된 제어를 확보하려는 경우.
주제 유형을 표시하는 아이콘 개념 주제
Information Center의 이용 약관 | 피드백

시간소인 아이콘 마지막 업데이트 날짜: 2014-05-22

파일 이름: c_entity_manager.html