Jakie jest najlepsze podejście do pobrania EntityManagerFactory w aplikacji internetowej (jsp/servlets). jest to dobry sposób When should EntityManagerFactory instance be created/opened?, lub że lepiej dostać od JNDI, lub coś innego ...Najlepsza praktyka uzyskiwania EntityManagerFactory
Odpowiedz
Są wagi ciężkiej i oni mają być w zakresie aplikacji. Musisz więc otworzyć je podczas uruchamiania aplikacji i zamknąć je przy wyłączaniu aplikacji.
Sposób wykonania zależy od docelowego kontenera. Czy obsługuje EJB 3.x (Glassfish, JBoss AS, itp.)? Jeśli tak, to nie trzeba się martwić o otwarcie/zamknięcie ich (ani o transakcjach) w ogóle, jeśli po prostu wykonać zadanie WZP w EJB 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żeli kontener docelowy nie robi Obsługa EJB (np. Tomcat, Jetty, itp.) i dodatku EJB, takiego jak OpenEJB, również nie jest opcją z jakiegoś powodu, więc w ten sposób ręcznie tworzysz własne (i transakcje) EntityManager
, a następnie najlepiej. to ServletContextListener
. Oto podstawowym przykładem kickoff:
@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 Servlet 3.0, klasa ta musi być zarejestrowana przez <listener>
w web.xml
zamiast @WebListener
)
który może być używany jako:
EntityManager em = EMF.createEntityManager();
// ...
Doskonały przykład jak zawsze, ale chciał tylko dodać, że przy użyciu @PersistenceContext bez atrybutu "unitName" oznacza to (i w sposób niedeklarujący) użycie jedynej/domyślnej jednostki trwałości zdefiniowanej w "persistence.xml". Jeśli istnieje wiele źródeł danych/jednostek trwałości, może to prowadzić do niejasności co do tego, który z nich jest. –
Nie jestem pewien, co jeszcze brakuje, podążam za twoją odpowiedzią, ale pojawia się błąd runtime? > Spowodowane przez: org.springframework.beans.factory.NoSuchBeanDefinitionException: Nie zdefiniowano unikatowej fasoli typu [javax.persistence.EntityManagerFactory]: oczekiwany pojedynczy komponent bean, ale znaleziono 0: – huahsin68
@ huahsin68: Pierwotne pytanie nie dotyczy w ogóle Springa i nie robię też wiosny. Wystarczy nacisnąć "Zadaj pytanie". – BalusC