web-dev-qa-db-ja.com

EntityManagerFactoryを取得するためのベストプラクティス

Webアプリ(jsp/servlets)でEntityManagerFactoryを取得する最善の方法は何ですか?これは良い方法ですか EntityManagerFactoryインスタンスをいつ作成/開く必要がありますか? 、またはJNDIなどから取得した方が良いですか?

23
Evgeni Dimitrov

彼らはヘビー級であり、アプリケーションの範囲内にあるはずです。したがって、アプリケーションの起動時にこれらを開き、アプリケーションのシャットダウン時に閉じる必要があります。

その方法は、ターゲットコンテナによって異なります。 EJB 3.x(Glassfish、JBoss ASなど)をサポートしていますか?もしそうなら、 @PersistenceContext 通常の方法:

@Stateless
public class FooService {

    @PersistenceContext
    private EntityManager em;

    public Foo find(Long id) {
        return em.find(Foo.class, id);
    }

    // ...
}

ターゲットコンテナーがEJB(たとえば、Tomcat、Jettyなど)をサポートしておらず、 OpenEJB のようなEJBアドオンも何らかの理由でオプションではない場合、手動で作成する必要があります。 EntityManagers(およびトランザクション)をご自分で行った場合、最善の策は ServletContextListener です。これはbasicキックオフの例です:

@WebListener
public class EMF implements ServletContextListener {

    private static EntityManagerFactory emf;

    @Override
    public void contextInitialized(ServletContextEvent event) {
        emf = Persistence.createEntityManagerFactory("unitname");
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        emf.close();
    }

    public static EntityManager createEntityManager() {
        if (emf == null) {
            throw new IllegalStateException("Context is not initialized yet.");
        }

        return emf.createEntityManager();
    }

}

(注:サーブレット3.0以前では、このクラスは<listener> in web.xml の代わりに - @WebListener

これは次のように使用できます。

EntityManager em = EMF.createEntityManager();
// ...
62
BalusC