2011-10-22 10 views
18

प्राप्त करने का सर्वोत्तम अभ्यास वेब ऐप (jsp/servlets) में EntityManagerFactory प्राप्त करने का सबसे अच्छा तरीका क्या है। यह एक अच्छा तरीका है When should EntityManagerFactory instance be created/opened?, है या यह बेहतर है JNDI, या कुछ और से इसे पाने के ...EntityManagerFactory

उत्तर

57

वे दिग्गज हैं और वे आवेदन दायरे में होना चाहिए रहे हैं। इसलिए, आपको उन्हें एप्लिकेशन स्टार्टअप पर खोलने और एप्लिकेशन शटडाउन पर बंद करने की आवश्यकता है।

यह कैसे करें आपके लक्षित कंटेनर पर निर्भर करता है। क्या यह ईजेबी 3.x (ग्लासफ़िश, जेबॉस एएस, आदि) का समर्थन करता है?

@Stateless 
public class FooService { 

    @PersistenceContext 
    private EntityManager em; 

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

    // ... 
} 

अपने लक्ष्य कंटेनर नहीं करता है, तो: यदि हां, तो फिर आप उन्हें बंद करने (न तो लेन-देन के बारे में) सभी अगर आप सिर्फ हमेशा की तरह @PersistenceContext साथ EJBs में जेपीए काम करने में खोलने के बारे में चिंता की जरूरत नहीं है/ईजेबी (जैसे टोमकैट, जेट्टी, इत्यादि) और OpenEJB जैसे ईजेबी ऐड-ऑन का समर्थन कुछ कारणों से भी एक विकल्प नहीं है, और आप इस प्रकार EntityManager एस (और लेनदेन) स्वयं बनाने के साथ मैन्युअल रूप से झुका रहे हैं, तो आपकी सर्वश्रेष्ठ शर्त एक 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(); 
    } 

} 

:

(ध्यान दें: सर्वलेट 3.0 से पहले, इस वर्ग के web.xml@WebListener के बजाय में <listener> द्वारा पंजीकृत होना आवश्यक है) कौन सा रूप में इस्तेमाल किया जा सकता है: यहाँ एक बुनियादी किकऑफ़ उदाहरण है

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

हमेशा के रूप में उत्कृष्ट उदाहरण लेकिन केवल "यूनिटनाम" विशेषता के साथ @PersistenceContext का उपयोग करते समय इसे जोड़ना चाहता था, इसका तात्पर्य है (i n एक गैर-घोषणात्मक तरीका) "persistence.xml" में परिभाषित एकमात्र/डिफ़ॉल्ट दृढ़ता-इकाई का उपयोग। यदि कई डेटा स्रोत/दृढ़ता-इकाइयां हैं, तो इससे कुछ भ्रम पैदा हो सकता है कि यह कौन सा है। –

+0

सुनिश्चित नहीं है कि और क्या गुम है, मैं आपके उत्तर का पालन करता हूं लेकिन रनटाइम त्रुटि है? > के कारण: org.springframework.beans.factory.No.SuchBeanDefinitionException: प्रकार का कोई अनोखा बीन [javax.persistence.EntityManagerFactory] परिभाषित किया गया है: अपेक्षित एकल बीन लेकिन पाया 0: – huahsin68

+3

@ huahsin68: मूल प्रश्न में स्प्रिंग शामिल नहीं है और मैं वसंत भी नहीं करता हूं। बस "प्रश्न पूछें" दबाएं। – BalusC

संबंधित मुद्दे