いくつかのプロジェクトで私は正常に使用しています
@PersistenceUnit(unitName = "MiddlewareJPA")
EntityManagerFactory emf;
...
EntityManager entityManager = emf.createEntityManager();
データベース接続用のEntityManager
を取得しましたが、数日前にプロジェクトをJboss EAP 6.2
に移動しようとしましたが、EntityManager
を作成できませんでした。私はそれをグーグルで探していたので、@PersistenceUnit
を変更する必要があることがわかりました
@PersistenceContext(unitName = "MiddlewareJPA")
private EntityManager entityManager;
EntityManagerを取得します。うまくいきましたが、理由はわかりません。 PersistenceUnit
とPersistenceContext
の違いは何ですか?それぞれの長所と短所は何ですか?それらのどこを使用すべきですか?
Java EE)でどのように機能するかはわかりませんが、Springでは、@PersistenceContext
アノテーションを指定すると、EntityManager
が挿入されます。EntityManager
はどこで取得されますか? EntityManagerFactory.createEntityManager()
を呼び出して、アプリケーションのライフタイム全体でEntityManager
を1つ作成するため、代わりにEntityManager
インターフェイスの特別な実装が使用され、直接インスタンス化されます。これは、real EntityManager
。メソッドの実装は、このrealEntityManager
への呼び出しをリダイレクトします。そして、各リクエストの前にEMF.createEntityManager()
を呼び出してEM
を取得するサーブレットリスナーがあります。また、特別なEM
の内部参照に割り当てます。また、このリスナーは、realでgetTransaction().begin()
、.commit()
および.rollback()
を呼び出してトランザクションを管理しますEM
。これは、実行された作業の非常に簡略化された説明です。 g.
通常、EntityManager
と@PersistenceUnit
を使用して、手動でEntityManagerFactory
を作成/破棄し、トランザクションも管理する必要があるため、EntityManager
を挿入する方が適切です。
PersistenceUnit
はEntityManagerFactory
を注入し、PersistenceContext
はEntityManager
を注入します。通常、PersistenceContext
ライフサイクルを手動で管理する必要がない限り、EntityManager
を使用することをお勧めします。
EntityManager経由で取得@ PersistenceContext Container Managedと呼ばれますEntityManagerコンテナーは「EntityManager」の管理を担当します。 EntityManager経由で取得@ PersistenceUnit/entityManagerFactory.createEntityManager()は、開発者がアプリケーションで管理します。 (たとえば、EntityManagerのライフサイクルの管理、EntityManagerによって取得されたリソースの解放など)。