2011-10-22 25 views

cevap

57

... iyi JNDI veya başka bir şeyden kaynaklanıyor olsun. Bu nedenle, bunları uygulama başlangıcında açmanız ve uygulama kapatma üzerinde kapatmanız gerekir.

Bu nasıl yapılır? Hedef kabınıza göre değişir. EJB 3.x'i (Glassfish, JBoss AS, vb.) Destekliyor mu?

@Stateless 
public class FooService { 

    @PersistenceContext 
    private EntityManager em; 

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

    // ... 
} 

hedef konteyner Eğer burada: Eğer öyleyse, o zaman sadece @PersistenceContext ile olağan şekilde EJB'ler JPA işi bütün eğer (ne işlemlerle ilgili) onları açma/kapama konusunda endişelenmenize gerek yok EJB'leri (örn. Tomcat, Jetty, vb.) ve OpenEJB gibi bir EJB eklentisini desteklemenin bir nedeni de yoktur ve bu nedenle EntityManager s (ve işlemler) oluşturma ile elle oynamanızdır, o zaman en iyi bahsiniz ServletContextListener.

@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(); 
    } 

} 

:

(not: Servlet 3.0 önce bu sınıf web.xml yerine @WebListener içinde <listener> tarafından tescil edilmesi gerekmektedir) olarak kullanılabilir: Burada bir temel başlama örnek

EntityManager em = EMF.createEntityManager(); 
// ... 
+0

Her zamanki gibi mükemmel bir örnek, sadece "UnitName" özniteliği olmadan @PersistenceContext kullanırken bunu eklemek istedim, (i n bir bildirim dışı yol) "persistence.xml" içinde tanımlanan tek/varsayılan kalıcılık biriminin kullanılması. Birden fazla veri kaynağı/kalıcılık birimi varsa, hangisinin olduğuyla ilgili bir karışıklığa yol açabilir. –

+0

Başka nelerin eksik olduğundan emin değilim, cevabınızı takip ediyorum ancak bir çalışma zamanı hatası var mı? > Nedeniyle: org.springframework.beans.factory.NoSuchBeanDefinitionException: [javax.persistence.EntityManagerFactory] türünde benzersiz bir fasulye tanımlanmadı: beklenen tek fasülye bulundu ancak 0: – huahsin68

+3

@ huahsin68: Asıl soru hiç bir şekilde Bahar içermiyor ve ben de Spring'i yapmam. Sadece "Soru Sor" tuşuna basın. – BalusC

İlgili konular