1

私はEJBが初めてです。em.close()EnityManger は、EJB 3.0 のステートレスまたはステートフル セッション Beanの自分自身 ( ) で閉じる必要があることを知りたいです(@preDestroyアノテーションが使用されるメソッド内にある可能性があります)。それは ejb コンテナーによって閉じられ、そのリソースを解放し、必要な DB データを取得した後に EnitityManger に留まる必要はありませんか? 自分で停止または閉鎖する必要があるサービスは何ですか?

4

1 に答える 1

3

EJB では、通常、そのようなことを行う必要はありません。

エンティティ マネージャはデフォルトでコンテナ管理され、関連する永続コンテキストはトランザクション スコープです。これは、エンティティ マネージャを作成または閉じる必要がなく、何かを開始、コミット、またはロールバックする必要がないことを意味します。

トランザクションを開始するメソッド (これも透過的に行われます) が完了すると、トランザクション スコープの永続コンテキストがフラッシュされ (すべての未処理の更新が DB に書き込まれます)、消去されます (L1 キャッシュが破棄されます)。そのエンティティ マネージャに関連するリソース。

標準的な例:

@Stateless 
public class CustomerService { 

  @PersistenceContext 
  private EntityManager entityManager; 

  public void addCustomer(Customer customer) { 
    entityManager.persist(customer); 
  } 
}

本当に必要な場合は、代わりにファクトリを注入し、そこからエンティティ マネージャを取得することで、アプリケーション管理のエンティティ マネージャを使用できることに注意してください。そのような状況では、実際に自分で閉鎖する必要があります。これを Bean 管理のトランザクションと拡張永続コンテキストと組み合わせると、EJB でもすべてを自分で行う必要がある状況になります。ただし、これは非常にまれであり、オプションとしてのみ提供されます。デフォルトではありません。

于 2012-08-18T12:06:54.160 に答える