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 उदाहरण द्वारा चित्रित किया गया है ।Persistence
EntityManagerFactoryBuilder
LocalContainerEntityManagerFactoryBean
जेपीए के माध्यम से बूटस्ट्रैपिंग को प्राथमिकता दी जानी है। ऐसा इसलिए है क्योंकि जेपीए 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
जब आप अपने प्राकृतिक पहचानकर्ता के माध्यम से इकाई को प्राप्त करना चाहते हैं, तो जेबीए में उपलब्ध कुछ हाइबरनेट-विशिष्ट विधियों तक पहुँच प्राप्त करना चाहते हैं, तो उन्हें अपने संबंधित हाइबरनेट इंटरफेस में अनचेक करें ।