Najlepsze praktyki, aby uzyskać EntityManagerFactory
Jakie jest najlepsze podejście do uzyskania EntityManagerFactory w aplikacji internetowej (jsp/servlets)? Czy jest to dobry sposób Kiedy należy utworzyć/otworzyć instancję EntityManagerFactory?, a może lepiej dostać to od JNDI, czy coś innego?
1 answers
/ Align = "left" / Musisz je otworzyć przy uruchamianiu aplikacji i zamknąć przy zamykaniu aplikacji.
Jak to zrobić zależy od docelowego kontenera. Czy obsługuje EJB 3.x (Glassfish, JBoss AS, etc)? Jeśli tak, to nie musisz się martwić o ich otwieranie/zamykanie (ani o transakcje) w ogóle, jeśli po prostu wykonujesz zadanie JPA w EJBs z @PersistenceContext
zwykły sposób:
@Stateless
public class FooService {
@PersistenceContext
private EntityManager em;
public Foo find(Long id) {
return em.find(Foo.class, id);
}
// ...
}
Jeśli docelowy Pojemnik Tomcat, Jetty, itp.) i dodatek EJB, taki jak OpenEJB , również nie jest opcją z jakiegoś powodu, a zatem ręcznie majstrujesz przy tworzeniu EntityManager
s (i transakcjach) samodzielnie, wtedy najlepszym rozwiązaniem jest ServletContextListener
. Oto podstawowy przykład:
@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();
}
}
(uwaga: przed Servletem 3.0 klasa ta musi być zarejestrowana przez <listener>
w web.xml
zamiast @WebListener
)
Który może być użyty jako:
EntityManager em = EMF.createEntityManager();
// ...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-23 01:04:52