12.5. Jakarta Persistence EntityManager
Jakarta Persistence エンティティーマネージャーは、永続コンテキストへの接続を表します。エンティティーマネージャーを使用して永続コンテキストによって定義されるデータベースの読み書きが可能です。
永続コンテキストは、javax.persistence
パッケージの Java アノテーション @PersistenceContext
を介して提供されます。エンティティーマネージャーは、Java クラス javax.persistence.EntityManager
を介して提供されます。管理対象 bean では、以下のように EntityManager
インスタンスをインジェクトできます。
例: エンティティーマネージャーのインジェクション
@Stateless public class UserBean { @PersistenceContext EntityManager entitymanager; ... }
12.5.1. アプリケーション管理の EntityManager
アプリケーション管理のエンティティーマネージャーは基盤の永続プロバイダーである org.hibernate.jpa.HibernatePersistenceProvider
への直接アクセスを提供します。アプリケーション管理のエンティティーマネジャーの範囲は、アプリケーションによって作成された時からアプリケーションによってクローズされるまでです。@PersistenceUnit
アノテーションを使用して、永続ユニットを javax.persistence.EntityManagerFactory
インターフェイスにインジェクトできます。これにより、アプリケーション管理のエンティティーマネジャーが返されます。
アプリケーション管理のエンティティーマネージャーは、特定の永続ユニットにて EntityManager
インスタンスすべてで Jakarta Transactions トランザクションを使用して伝搬されていない永続コンテキストへアプリケーションがアクセスする必要があるときに使用できます。この場合、各 EntityManager
インスタンスは新たに分離された永続コンテキストを作成します。EntityManager
インスタンスと関連する PersistenceContext
は、アプリケーションによって明示的に作成および破棄されます。EntityManager
インスタンスはスレッドセーフではないため、EntityManager
インスタンスを直接インジェクトできないときにアプリケーション管理のエンティティーマネージャーを使用することもできます。EntityManagerFactory
はスレッドセーフです。
例: アプリケーション管理のエンティティーマネージャー
@PersistenceUnit EntityManagerFactory emf; EntityManager em; @Resource UserTransaction utx; ... em = emf.createEntityManager(); try { utx.begin(); em.persist(SomeEntity); em.merge(AnotherEntity); em.remove(ThirdEntity); utx.commit(); } catch (Exception e) { utx.rollback(); }
12.5.2. コンテナー管理の EntityManager
コンテナー管理のエンティティーマネージャーは、アプリケーションの基盤となる永続プロバイダーを管理します。トランザクションスコープの永続コンテキストまたは拡張永続コンテキストを使用できます。コンテナー管理のエンティティーマネージャーは、必要に応じて基盤となる永続プロバイダーのインスタンスを作成します。基盤の永続プロバイダー org.hibernate.jpa.HibernatePersistenceProvider
インスタンスが新たに作成されるたびに、新しい永続コンテキストも作成されます。