SessionFactory बनाम EntityManagerFactory
जैसा कि मैंने में विस्तार से बताया हाइबरनेट उपयोगकर्ता गाइड , हाइबरनेट SessionFactoryजेपीए फैली EntityManagerFactoryरूप में निम्न आरेख से दिखाया गया है:

तो, SessionFactoryएक जेपीए भी हैEntityManagerFactory ।
दोनों में SessionFactoryऔर EntityManagerFactoryइकाई मैपिंग मेटाडेटा होते हैं और आपको हाइबरनेट Sessionया ए बनाने की अनुमति देते हैं EntityManager।
Session बनाम EntityManager
SessionFactoryऔर की तरह EntityManagerFactory, हाइबरनेट Sessionजेपीए का विस्तार करता है EntityManager। तो, सभी तरीकों को परिभाषित EntityManagerहाइबरनेट में उपलब्ध हैंSession ।
Sessionऔर `EntityManager का अनुवाद इकाई राज्य संक्रमण SQL कथन में, का चयन करें, सम्मिलित करें, अद्यतन, और DELETE।
हाइबरनेट बनाम जेपीए बूटस्ट्रैप
JPA या हाइबरनेट एप्लिकेशन को बूटस्ट्रैप करते समय, आपके पास दो विकल्प होते हैं:
- आप हाइबरनेट देशी तंत्र के माध्यम से बूटस्ट्रैप कर सकते हैं, और के
SessionFactoryमाध्यम से बना सकते हैं BootstrapServiceRegistryBuilder। यदि आप स्प्रिंग का उपयोग कर रहे हैं, तो हाइबरनेट बूटस्ट्रैप के माध्यम से किया जाता है LocalSessionFactoryBean, जैसा कि इस GitHub उदाहरण द्वारा चित्रित किया गया है ।
- या, आप वर्ग या के
EntityManagerFactoryमाध्यम से एक जेपीए बना सकते हैं । यदि आप स्प्रिंग का उपयोग कर रहे हैं, तो जेपीए बूटस्ट्रैप के माध्यम से किया जाता है , जैसा कि इस GitHub उदाहरण द्वारा चित्रित किया गया है ।PersistenceEntityManagerFactoryBuilderLocalContainerEntityManagerFactoryBean
जेपीए के माध्यम से बूटस्ट्रैपिंग को प्राथमिकता दी जानी है। ऐसा इसलिए है क्योंकि जेपीए FlushModeType.AUTOविरासत से बेहतर विकल्प है FlushMode.AUTO, जो देशी एसक्यूएल प्रश्नों के लिए रीड-योर-राइट्स संगति को तोड़ता है ।
JPA को हाइबरनेट करना
यदि आप JPA के माध्यम से बूटस्ट्रैप करते हैं, और आपने एनोटेशन के EntityManagerFactoryमाध्यम से इंजेक्शन लगाया है @PersistenceUnit:
@PersistenceUnit
private EntityManagerFactory entityManagerFactory;
आप आसानी Sessionfactoryसे unwrapविधि का उपयोग करके अंतर्निहित तक पहुंच सकते हैं :
SessionFactory sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
जेपीए के साथ भी ऐसा ही किया जा सकता है EntityManager। यदि आप एनोटेशन के EntityManagerमाध्यम से इंजेक्ट करते हैं @PersistenceContext:
@PersistenceContext
private EntityManager entityManager;
आप आसानी Sessionसे unwrapविधि का उपयोग करके अंतर्निहित तक पहुंच सकते हैं :
Session session = entityManager.unwrap(Session.class);
निष्कर्ष
इसलिए, आपको JPA के माध्यम से बूटस्ट्रैप करना चाहिए , और , का उपयोग करना चाहिए EntityManagerFactoryऔर EntityManagerजब आप अपने प्राकृतिक पहचानकर्ता के माध्यम से इकाई को प्राप्त करना चाहते हैं, तो जेबीए में उपलब्ध कुछ हाइबरनेट-विशिष्ट विधियों तक पहुँच प्राप्त करना चाहते हैं, तो उन्हें अपने संबंधित हाइबरनेट इंटरफेस में अनचेक करें ।