2011-10-22 20 views

Odpowiedz

57

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(); 
// ... 
+0

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. –

+0

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

+3

@ huahsin68: Pierwotne pytanie nie dotyczy w ogóle Springa i nie robię też wiosny. Wystarczy nacisnąć "Zadaj pytanie". – BalusC

Powiązane problemy