엔티티 관리자

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

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

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

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

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

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

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

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

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

엔티티 관리자 오퍼레이션

엔티티 관리자가 수행할 수 있는 기본 오퍼레이션:
표 1. 엔티티 관리자 오퍼레이션
오퍼레이션 설명
지속
  • 새 엔티티 인스턴스를 데이터베이스에 삽입하십시오.
  • 소유된 관계 참조 및 엔티티의 지속성 상태를 저장하십시오.
  • 엔티티 인스턴스가 관리됩니다.
찾기 지정된 지속적 ID(1차 키)를 가진 관리되는 엔티티 인스턴스를 확보하며 찾을 수 없는 경우 널(null)을 리턴합니다.
제거 데이터베이스에서 지정된 지속적 ID를 가진 관리되는 엔티티를 삭제합니다.
병합 분리된 엔티티의 상태가 분리된 엔티티의 관리되는 사본에 병합됩니다. 리턴되는 관리되는 엔티티는 분리된 엔티티와 다른 Java™ ID를 가집니다.
새로 고치기 데이터베이스에서 엔티티 상태를 다시 로드합니다.
잠금 지속성 컨텍스트에 포함된 엔티티 오브젝트에 대해 잠금 모드를 설정합니다.
비우기 데이터베이스와 강제로 동기화합니다.
포함 엔티티가 현재 지속성 컨텍스트에 포함되는지 판별합니다.
createQuery 동적 Java 지속적 조회 언어를 사용하여 조회 인스턴스를 작성합니다.
createNamedQuery 사전 정의된 조회의 인스턴스를 작성합니다.
createNativeQuery SQL 조회의 인스턴스를 작성합니다.

컨테이너 관리 엔티티 관리자

Java EE 환경에서 엔티티 관리자를 사용하는 한 가지 방법은 컨테이너 관리 엔티티 관리자를 사용하는 것입니다. 이 모드에서 컨테이너는 엔티티 관리자의 열기 및 닫기를 담당하므로 애플리케이션에 대해 투명한 방식으로 지속적 컨텍스트의 라이프사이클 열기 및 닫기도 담당합니다. 컨테이너 관리 엔티티 관리자는 트랜잭션 경계도 담당합니다.

컨테이너 관리 엔티티 관리자는 JNDI 찾아보기 또는 종속성 삽입을 통해 애플리케이션에서 확보되며 컨테이너는 애플리케이션에 대해 투명하게 엔티티 관리자 팩토리를 사용한 삽입을 관리합니다.

지속성 컨텍스트가 현재 JTA 트랜잭션과 함께 자동으로 전달되므로 컨테이너 관리 엔티티 관리자는 JTA 트랜잭션을 사용해야 하며 동일한 지속성 단위에 맵핑된 엔티티 관리자 참조에서는 JTA 트랜잭션 내의 이 동일한 지속성 컨텍스트에 대한 액세스를 제공합니다. Java EE 컨테이너에 의한 이러한 지속성 컨텍스트의 전달은 애플리케이션이 한 컴포넌트에서 다른 컴포넌트로 엔티티 관리자 인스턴스에 대한 참조를 전달하지 않아도 됨을 의미합니다.

컨테이너 관리 지속성 컨텍스트는 두 가지 다른 범위 중 하나를 가지도록 정의될 수 있습니다.
  • 트랜잭션 지속성 범위
  • 확장 지속성 범위

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

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

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

피드백