Hibernate SessionFactory बनाम JPA EntityManagerFactory


251

मैं हाइबरनेट के लिए नया हूं और मुझे यकीन नहीं है कि हाइबरनेट बनाने के लिए हाइबरनेट SessionFactoryया जेपीए EntityManagerFactoryका उपयोग करना है या नहीं Session

इन दोनों के बीच क्या अंतर है? उनमें से प्रत्येक का उपयोग करने के पेशेवरों और विपक्ष क्या हैं?


6
डुप्लिकेट प्रश्न पर यह उत्तर वास्तव में अच्छा है। stackoverflow.com/questions/23445830/…
सांग्युन ली

जवाबों:


365

पसंद करते हैं EntityManagerFactoryऔर EntityManager। उन्हें जेपीए मानक द्वारा परिभाषित किया गया है।

SessionFactoryऔर Sessionहाइबरनेट-विशिष्ट हैं। EntityManagerहुड के नीचे हाइबरनेट सत्र invokes। और अगर आपको कुछ विशिष्ट सुविधाओं की आवश्यकता है जो कि उपलब्ध नहीं हैं EntityManager, तो आप कॉल करके सत्र प्राप्त कर सकते हैं:

Session session = entityManager.unwrap(Session.class);

2
@elpisu - मैं वास्तव में सिफारिश नहीं कर सकता। मैं केवल आधिकारिक दस्तावेज को सीखने के संसाधन (कम से कम पिछले 2 वर्षों में) के रूप में उपयोग कर रहा हूं, इसलिए मुझे और कुछ भी विश्वसनीय नहीं है। लेकिन डॉक्स काफी अच्छे हैं।
बूझो

7
@Bozho मुझे पता है कि यह देर हो चुकी है लेकिन क्या सत्र और सत्र का उपयोग करने की कमियां हैं? जेपीए का उपयोग क्यों पसंद किया जाता है? धन्यवाद
माइकेल Marrache

12
@MickaelMarrache JPA का उपयोग हाइबरनेट एपीआई पर पसंद किया जाना है, क्योंकि यह जावा एंटरप्राइज मानक है। JPA का उपयोग करना (और हाइबरनेट-विशिष्ट सुविधाओं का उपयोग किए बिना, अपने आप को इसे प्रतिबंधित करना) एप्लिकेशन पोर्टेबिलिटी में सुधार करता है, यानी आपके पास अपने आवेदन में न्यूनतम परिवर्तनों के साथ एक अलग दृढ़ता फ्रेमवर्क पर स्विच करने का विकल्प है, जब तक कि फ्रेमवर्क भी जेपीए मानक के अनुरूप नहीं हो जाता है ।
लेज़्ज़्लो वैन डेन होके

2
क्या यह बेहतर है क्योंकि यह एक उद्यम मानक है? मुझे शक है कि। मानक आमतौर पर विकसित और जटिल होते हैं। कुछ वास्तविक जीवन के लाभों के बारे में क्या? जेपीए बेहतर है क्योंकि इसमें टाइपडाइक है, आपको सभी जगह टाइपकास्ट करने से रोकता है।
बैस्टियन वोइगट

1
इस दृष्टिकोण प्राप्त करने के लिए है Sessionसे EntityManager, के रूप में ही SessionFactory.getCurrentSession()? मेरा मतलब है, Sessionअगर यह पहले से निर्मित नहीं है तो क्या यह नया खुल जाएगा ? यह बहुपरत वातावरण में कैसे काम करता है?
सर्वेश

32

मैं इस पर जोड़ना चाहता हूं कि आप कॉल getDelegate()विधि से हाइबरनेट का सत्र भी प्राप्त कर सकते हैं EntityManager

उदाहरण के लिए:

Session session = (Session) entityManager.getDelegate();

28
ध्यान दें कि unwrap()है पसंद किया जा करने के लिए खत्म हो गया getDelegate(): जावा डॉक्स के अनुसार javaee 6 , और javaee 7
रेयनस

22

मैं JPA2 EntityManagerAPI को अधिक पसंद करता हूं SessionFactory, क्योंकि यह अधिक आधुनिक लगता है। एक सरल उदाहरण:

जेपीए:

@PersistenceContext
EntityManager entityManager;

public List<MyEntity> findSomeApples() {
  return entityManager
     .createQuery("from MyEntity where apples=7", MyEntity.class)
     .getResultList();
}

SessionFactory:

@Autowired
SessionFactory sessionFactory;

public List<MyEntity> findSomeApples() {
  Session session = sessionFactory.getCurrentSession();
  List<?> result = session.createQuery("from MyEntity where apples=7")
      .list();
  @SuppressWarnings("unchecked")
  List<MyEntity> resultCasted = (List<MyEntity>) result;
  return resultCasted;
}

मुझे लगता है कि यह स्पष्ट है कि पहले वाला साफ दिखता है और परीक्षण करना भी आसान है क्योंकि एंटिटी मैनजर का आसानी से मजाक उड़ाया जा सकता है।


30
आप चाहें तो किसी भी कोड को जटिल बना सकते हैं। return sessionFactory.getCurrentSession().createQuery("from User where id=1").list()
wst

आपको सीधे तौर पर यूनिट मैनजर कैसे मिला और आप दिखा रहे हैं कि आपको सेशन लाने के लिए सेशन का इस्तेमाल करना होगा:: D
JavaLearner

21

EntityManagerFactory दृष्टिकोण का उपयोग करके हमें कॉलबैक विधि एनोटेशन जैसे @PrePersist, @ PostPersist, @ PreUpdate को बिना किसी अतिरिक्त कॉन्फ़िगरेशन के उपयोग करने की अनुमति मिलती है।

SessionFactory का उपयोग करते समय समान कॉलबैक का उपयोग करके अतिरिक्त प्रयासों की आवश्यकता होगी।

संबंधित हाइबरनेट डॉक्स यहां और यहां देखे जा सकते हैं

संबंधित एसओएफ प्रश्न और स्प्रिंग फोरम चर्चा


21

SessionFactory बनाम EntityManagerFactory

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

जेपीए और हाइबरनेट संबंध

तो, SessionFactoryएक जेपीए भी हैEntityManagerFactory

दोनों में SessionFactoryऔर EntityManagerFactoryइकाई मैपिंग मेटाडेटा होते हैं और आपको हाइबरनेट Sessionया ए बनाने की अनुमति देते हैं EntityManager

Session बनाम EntityManager

SessionFactoryऔर की तरह EntityManagerFactory, हाइबरनेट Sessionजेपीए का विस्तार करता है EntityManager। तो, सभी तरीकों को परिभाषित EntityManagerहाइबरनेट में उपलब्ध हैंSession

Sessionऔर `EntityManager का अनुवाद इकाई राज्य संक्रमण SQL कथन में, का चयन करें, सम्मिलित करें, अद्यतन, और DELETE।

हाइबरनेट बनाम जेपीए बूटस्ट्रैप

JPA या हाइबरनेट एप्लिकेशन को बूटस्ट्रैप करते समय, आपके पास दो विकल्प होते हैं:

  1. आप हाइबरनेट देशी तंत्र के माध्यम से बूटस्ट्रैप कर सकते हैं, और के SessionFactoryमाध्यम से बना सकते हैं BootstrapServiceRegistryBuilder। यदि आप स्प्रिंग का उपयोग कर रहे हैं, तो हाइबरनेट बूटस्ट्रैप के माध्यम से किया जाता है LocalSessionFactoryBean, जैसा कि इस GitHub उदाहरण द्वारा चित्रित किया गया है
  2. या, आप वर्ग या के 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जब आप अपने प्राकृतिक पहचानकर्ता के माध्यम से इकाई को प्राप्त करना चाहते हैं, तो जेबीए में उपलब्ध कुछ हाइबरनेट-विशिष्ट विधियों तक पहुँच प्राप्त करना चाहते हैं, तो उन्हें अपने संबंधित हाइबरनेट इंटरफेस में अनचेक करें ।


2

EntityManager का उपयोग करके, कोड को अब हाइबरनेट के साथ कसकर युग्मित नहीं किया जाता है। लेकिन इसके लिए, उपयोग में हमें उपयोग करना चाहिए:

javax.persistence.EntityManager

के बजाय

org.hibernate.ejb.HibernateEntityManager

इसी तरह, EntityManagerFactory के लिए, javax इंटरफ़ेस का उपयोग करें। इस तरह, कोड शिथिल युग्मित है। यदि हाइबरनेट की तुलना में बेहतर जेपीए 2 कार्यान्वयन है, तो स्विच करना आसान होगा। चरम मामले में, हम HibernateEntityManager को कास्ट कर सकते हैं।


2

EntityManagerFactory मानक कार्यान्वयन है, यह सभी कार्यान्वयनों में समान है। यदि आप अपने ORM को किसी अन्य प्रदाता जैसे EclipseLink के लिए माइग्रेट करते हैं, तो लेनदेन को संभालने के लिए दृष्टिकोण में कोई बदलाव नहीं होगा। इसके विपरीत, यदि आप हाइबरनेट के सत्र कारखाने का उपयोग करते हैं, तो यह हाइबरनेट एपीआई से बंधा है और नए विक्रेता के पास नहीं जा सकता है।


1

EntityManager इंटरफ़ेस हाइबरनेट में सेशनफैक्टरी के समान है। EntaxManager को javax.persistance पैकेज के तहत लेकिन सत्र और sessionFactory org.hibernate.Session / sessionFactory पैकेज के तहत।

इकाई प्रबंधक जेपीए विशिष्ट है और सत्र / सत्रफाइबर हाइबरनेट विशिष्ट हैं।


आपका उत्तर सही है, लेकिन अनिवार्य रूप से वही है जो उत्तर संगुन ली ने अपनी टिप्पणियों में संदर्भित किया है ... इसलिए एक डुप्लिकेट।
RWC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.