java EntityManager प्राप्त करने के विभिन्न तरीके




jpa (2)

EntityManager बनाने के लिए मैं देखे जाने वाले सामान्य मुहावरे इस तरह कुछ है:

public class BaseDao {

private static final String PERSISTENCE_UNIT_NAME = "Employee";
EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

public EntityManager getEntityManager() {
      return factory.createEntityManager();
    } 
}

तो इसका उपयोग इस तरह किया जाता है:

Employee emp = new Employee();
emp.setName("Joe M");
getEntityManager().persist(emp);

सवाल यह है कि ऐसा क्यों नहीं करते:

public class BaseDao{
    private static final String PERSISTENCE_UNIT_NAME = "Employee";
    EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    private EntityManager entityManager = null;


public void setEntityManger() {
        EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    this.entityManager = factory.createEntityManager();

    }

    public EntityManager getEntityManager() {
        return this.entityManager;
    }
}

दूसरे शब्दों में factory.createEntityManager () के माध्यम से हमेशा इकाई प्रबंधक प्राप्त करने की आवश्यकता है? या इसे एक उदाहरण (या यहां तक ​​कि स्थिर) चर के रूप में बनाया जा सकता है और इस तरह से पुनर्प्राप्त किया जा सकता है?

स्पष्टीकरण के लिए, मैं ऐसे माहौल के बारे में बात कर रहा हूं जो ईजेबी या स्प्रिंग कंटेनर का उपयोग नहीं करता है।

धन्यवाद।


आज आपको एंटिटी मैनेजर के प्रबंधन के लिए वसंत-डेटा और @PersistanceUnit जैसे कुछ समय देखना चाहिए।

एक EntityManager एक जेडीबीसी कनेक्शन के लिए सिर्फ एक रैपर एक रैपर से अधिक है। यह एक दृढ़ता संदर्भ के दायरे को परिभाषित करता है, जो लेनदेन के दौरान किए जाने वाले काम की इकाई को परिभाषित करता है (जब आप डेटाबेस को क्वेरी फ्लश करते हैं)। एक दृढ़ता संदर्भ के भीतर आपको यह भी गारंटी दी जाती है कि डेटाबेस में दी गई इकाई के परिणामस्वरूप एक ही जावा ऑब्जेक्ट होगा, भले ही आप इसे सीधे लोड करते हैं, या किसी अन्य इकाई के OneToMany संबंध के माध्यम से इसे एक्सेस करते हैं।

गैर-वसंत सेटिंग में EntityManagerFactory प्राप्त करने के बारे में मूल प्रश्न के संबंध में। आप बस कॉल करते हैं

Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

यह विधि आपके जेपीए कार्यान्वयन के आधार पर एक स्थिर फैक्ट्री विधि है, आपको या तो एक ही पीयू, या एक उथले रैपर के लिए एक ही उदाहरण मिलता है जो अंतर्निहित दृढ़ता सत्र को लपेटता है (जिसमें से एक प्रति पीयू है)।


EntityManager उदाहरण बनाने के दो तरीके हैं। एक तरीका एसडीके अनुप्रयोगों के लिए है, और मैं यूनिट परीक्षण में इस तरह से बहुत कुछ उपयोग करता हूं। आपके उदाहरण में यह वही है:

EntityManagerFactory factory = 
  Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

एंटरप्राइज़ अनुप्रयोगों में आप कंटेनर को आपके लिए बनाते हैं और आवश्यकता होने पर उन्हें इंजेक्ट करते हैं।

EntityManager एक जेडीबीसी कनेक्शन के आसपास सिर्फ एक रैपर है। यह बहुत हल्का वजन है और प्रदर्शन दंड के बिना बनाया और नष्ट किया जा सकता है।

ध्यान रखें कि EntityManager थ्रेड सुरक्षित नहीं है, इसलिए यदि आपके पास एक उदाहरण है, तो आपको उस तक पहुंच सिंक्रनाइज़ करने की आवश्यकता हो सकती है। विवरण के लिए लेनदेन मूल बातें देखें।

यहां बताया गया है कि मैं इसे कैसे करूंगा (मोटे तौर पर):

public class BaseDao{
  private static final String PERSISTENCE_UNIT_NAME = "Employee";
  private static EntityManagerFactory factory = 
    Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

  public void create(MyEntiy person){
    EntityManager em = factory.createEntityManager();
    em.getTransaction().begin();
    // do what ever you need 
    em.getTransaction().commit();
    em.close();
  }

  // add more methods to the dao.
}

एक बार जब आप इस प्रबल और तैयार हो जाते हैं, तो आप एक सामान्य डीएओ का उपयोग कर सकते हैं।





entitymanager