Webアプリ(jsp/servlets)でEntityManagerFactoryを取得する最善の方法は何ですか?これは良い方法ですか EntityManagerFactoryインスタンスをいつ作成/開く必要がありますか? 、またはJNDIなどから取得した方が良いですか?
彼らはヘビー級であり、アプリケーションの範囲内にあるはずです。したがって、アプリケーションの起動時にこれらを開き、アプリケーションのシャットダウン時に閉じる必要があります。
その方法は、ターゲットコンテナによって異なります。 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アドオンも何らかの理由でオプションではない場合、手動で作成する必要があります。 EntityManager
s(およびトランザクション)をご自分で行った場合、最善の策は 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();
// ...