JPA(Java Persistence API)

데이터 지속성은 애플리케이션이 비휘발성 스토리지 시스템의 정보를 유지하고 검색하는 수단입니다. JPA (Java™ Persistence API) 는 EJB 3.0 스펙 이후 지속성 및 오브젝트 관계 맵핑 및 기능을 관리하기 위한 메커니즘을 제공합니다.

Open Liberty Liberty에서 JPA 2.1 이상을 사용하는 방법에 대한 정보는 Open Liberty 웹 사이트를 참조하십시오.

관계형 데이터베이스에 대한 액세스는 필수이므로 지속성은 엔터프라이즈 애플리케이션에 있어서 대단히 중요합니다. 이 환경을 위해 개발되는 애플리케이션은 자체적으로 지속성을 관리하거나, 써드파티 솔루션을 사용하여 지속성에 대한 데이터베이스 업데이트 및 검색을 처리해야 합니다.

JPA 스펙은 벤더별 맵핑 구현에 의존하지 않고 오브젝트 관계형 맵핑을 내부적으로 정의합니다. JPA는 Java Enterprise Edition (Java EE) 환경에 적용되는 Java 프로그래밍 모델을 기반으로 하지만 JPA는 애플리케이션 기능을 테스트하기 위해 Java SE 환경에서 작동할 수 있습니다.

JPA는 지속성 프로그래밍 모델의 단순화를 나타냅니다. JPA 스펙은 벤더별 맵핑 구현에 의존하지 않고 오브젝트 관계형 맵핑을 명시적으로 정의합니다. JPA는 어노테이션 또는 XML을 사용하여 오브젝트를 하나 이상의 데이터베이스 테이블에 맵핑함으로써 오브젝트 관계형 맵핑의 중요한 태스크를 표준화합니다. 지속성 프로그래밍 모델을 보다 단순화하려면 다음 작업을 수행하십시오.

  • EntityManager API는 데이터베이스에 있는 모델을 유지하거나, 업데이트하거나, 검색하거나 제거할 수 있습니다.
  • EntityManager API 및 오브젝트 관계형 맵핑 메타데이터는 사용자가 지속성을 유지보수하기 위해 JDBC 또는 SQL 코드를 작성하지 않아도 대부분의 데이터베이스 조작을 처리합니다.
  • JPA는 작업 중인 데이터베이스 고유의 SQL 조회를 작성하지 않고 오브젝트를 검색하는 데 사용할 수 있는, 독립 EJB 조회 언어(JPQL이라고도 함)를 확장하는 조회 언어를 제공합니다.

JPA는 Java EE(Java Enterprise Edition) 컨테이너의 내부와 외부 모두에서 작동하도록 설계됩니다. JPA를 컨테이너 내부에서 실행하면 애플리케이션은 이 컨테이너를 사용하여 지속성 컨텍스트를 관리할 수 있습니다. JPA를 관리할 컨테이너가 없는 경우에는 애플리케이션이 직접 지속성 컨텍스트 관리를 처리해야 합니다. 컨테이너 관리 지속성을 위해 설계된 애플리케이션은 지속성을 처리하기 위한 많은 코드 구현을 필요로 하지 않지만. 이러한 애플리케이션은 컨테이너 외부에서 사용할 수 없습니다. 자체 지속성을 관리하는 응용프로그램은 컨테이너 환경 또는 Java SE 환경에서 작동할 수 있습니다.

EJB 3.x 프로그래밍 모델을 지원하는 Java EE 컨테이너는 지속성 제공자라고도 하는 JPA 구현을 지원해야 합니다. JPA 지속성 제공자는 EJB 3.x 환경에서 지속성 관리를 쉽게 할 수 있도록 다음 요소를 사용합니다.

지속성 단위
관계형 데이터베이스를 사용하여 완전한 오브젝트 관계형 모델 맵핑 Java 클래스 (엔티티+지원 구조) 를 정의합니다. EntityManagerFactory는 이 데이터를 사용하여 EntityManager를 통해 액세스할 수 있는 지속성 컨텍스트를 작성합니다.
EntityManagerFactory
데이터베이스 상호작용을 위한 EntityManager를 작성하는 데 사용됩니다. 애플리케이션 서버 컨테이너는 일반적으로 이 기능을 제공하지만 JPA 애플리케이션 관리 지속성을 사용하는 경우에는 EntityManagerFactory가 필요합니다. EntityManagerFactory의 인스턴스는 지속성 컨텍스트를 나타냅니다.
지속성 컨텍스트
애플리케이션이 현재 조작하고 있는 활성 인스턴스 세트를 정의합니다. 이 지속성 컨텍스트는 수동으로, 또는 인젝션을 통해 작성할 수 있습니다.
EntityManager
애플리케이션이 사용하고 있는 엔티티 오브젝트의 활성 콜렉션을 유지보수하는 자원 관리자입니다. EntityManager는 데이터베이스 상호작용 및 오브젝트 관계형 맵핑의 메타데이터를 처리합니다. EntityManager의 인스턴스는 지속성 컨텍스트를 나타냅니다. 컨테이너의 응용프로그램은 응용프로그램의 인젝션을 통하거나 Java 컴포넌트 네임 스페이스에서 찾아 EntityManager를 얻을 수 있습니다. 애플리케이션이 자체 지속성을 관리하는 경우에는 EntityManagerFactory에서 EntityManager를 얻습니다.
엔티티 오브젝트
데이터베이스 테이블의 행을 가장 단순한 양식으로 표시하는 단순 Java 클래스입니다. 엔티티 오브젝트는 concrete 클래스 또는 abstract 클래스가 될 수 있습니다. 이러한 오브젝트는 특성 또는 필드를 사용하여 상태를 관리합니다.

Java Persistence API 및 로컬 트랜잭션 컨텍스트

WebSphere에서는 관리 컴포넌트에 대한 글로벌 및 로컬 트랜잭션 컨텍스트를 둘 다 제공합니다. 이러한 컨텍스트를 관리 컴포넌트에 제공하고 서비스 관리 컴포넌트에 스레드를 포함하면 글로벌 트랜잭션 컨텍스트(GTC)나 로컬 트랜잭션 컨텍스트(LTC)에서 트랜잭션이 항상 활성입니다.

이 처리는 @PersistenceUnit으로 애플리케이션에 삽입된 EntityManagerFactories를 통해 획득한 JPA EntityManagers인 애플리케이션 관리 지속성 컨텍스트에 영향을 주지 않습니다. 그러나, 이 처리는 @PersistenceContext를 통해 삽입된 JPA EntityManagers인 컨테이너 관리 지속성 컨텍스트(CMTS)에는 영향을 줍니다. JPA API 메소드를 GTC 경계 외부에서 호출하는 경우 TransactionRequiredException이 발생해야 하며 이 예외의 발생은 예상된 것입니다. 하지만, LTC가 활성 상태로 남아 있는 동안 새 GTC가 시작되거나 컴포넌트 서비스 호출이 종료될 때까지 CMTS 지속성 컨텍스트가 활성 상태로 유지됩니다. LTC 바인딩 내의 CMTS EntityManager에서 찾거나 조회하여 가져온 엔티티는 즉시 분리되지 않고 계속 지속성 컨텐스트에서 관리합니다. 이 처리의 결과는 예상치 못한 동작이나 일부 JPA 프로그래밍 안내서의 동작과 다른 것으로 보일 수 있지만 LTC에서 활성 상태로 유지하는 지속성 컨텍스트는 GTC가 시작되면 처분되며 해당 지속성 컨텍스트에서 관리하는 엔티티는 분리됩니다.