web-dev-qa-db-ja.com

PersistenceUnitとPersistenceContext

いくつかのプロジェクトで私は正常に使用しています

@PersistenceUnit(unitName = "MiddlewareJPA")
EntityManagerFactory emf;
...
EntityManager entityManager = emf.createEntityManager();

データベース接続用のEntityManagerを取得しましたが、数日前にプロジェクトをJboss EAP 6.2に移動しようとしましたが、EntityManagerを作成できませんでした。私はそれをグーグルで探していたので、@PersistenceUnitを変更する必要があることがわかりました

@PersistenceContext(unitName = "MiddlewareJPA")
private EntityManager entityManager;

EntityManagerを取得します。うまくいきましたが、理由はわかりません。 PersistenceUnitPersistenceContextの違いは何ですか?それぞれの長所と短所は何ですか?それらのどこを使用すべきですか?

44
user2377971

Java EE)でどのように機能するかはわかりませんが、Springでは、@PersistenceContextアノテーションを指定すると、EntityManagerが挿入されます。EntityManagerはどこで取得されますか? EntityManagerFactory.createEntityManager()を呼び出して、アプリケーションのライフタイム全体でEntityManagerを1つ作成するため、代わりにEntityManagerインターフェイスの特別な実装が使用され、直接インスタンス化されます。これは、real EntityManager。メソッドの実装は、このrealEntityManagerへの呼び出しをリダイレクトします。そして、各リクエストの前にEMF.createEntityManager()を呼び出してEMを取得するサーブレットリスナーがあります。また、特別なEMの内部参照に割り当てます。また、このリスナーは、realgetTransaction().begin().commit()および.rollback()を呼び出してトランザクションを管理しますEM。これは、実行された作業の非常に簡略化された説明です。 g.

通常、EntityManager@PersistenceUnitを使用して、手動でEntityManagerFactoryを作成/破棄し、トランザクションも管理する必要があるため、EntityManagerを挿入する方が適切です。

40
Alexey Andreev

PersistenceUnitEntityManagerFactoryを注入し、PersistenceContextEntityManagerを注入します。通常、PersistenceContextライフサイクルを手動で管理する必要がない限り、EntityManagerを使用することをお勧めします。

64
chrylis

EntityManager経由で取得@ PersistenceContext Container Managedと呼ばれますEntityManagerコンテナーは「EntityManager」の管理を担当します。 EntityManager経由で取得@ PersistenceUnit/entityManagerFactory.createEntityManager()は、開発者がアプリケーションで管理します。 (たとえば、EntityManagerのライフサイクルの管理、EntityManagerによって取得されたリソースの解放など)。

9
Raj