2012-02-21 14 views
5

मैं वसंत का उपयोग नहीं कर रहा हूं इसलिए मैं कक्षा के भीतर EntityManager का एक उदाहरण बना रहा हूं।हाइबरनेट एंटिटी मैनेजर, क्या इसे सिंगलटन के रूप में इस्तेमाल किया जाना चाहिए?

मैंने कक्षाओं को स्वत: उत्पन्न करने के लिए हाइबरनेट-एक्लिप्स रिवर्स इंजीनियरिंग का उपयोग किया। इन वर्गों में सभी में EntityManager का एक उदाहरण है।

मुझे 100% यकीन नहीं है कि हाइबरनेट एंटिटी मैनेजर के साथ कैसे काम करता है, इसलिए मुझे आश्चर्य है कि यह ठीक है कि इस वर्ग के इतने सारे उदाहरण (EntityManager) बनाए गए हैं, उदाहरण के लिए, लेनदेन के साथ समस्याएं होंगी?

क्या मुझे सिर्फ एक अलग वर्ग बनाना चाहिए जो मेरे सभी अन्य वर्गों के लिए EntityManager का एक स्थिर उदाहरण वितरित करे? या यह कोई महत्त्व नहीं रखता?

संपादित करें: मुझे लगता है कि @PersistenceContext नामक कुछ है, ऐसा लगता है कि यह मेरे persistence.xml को आवृत्ति चर में एक बीन के रूप में लोड नहीं कर रहा है, क्या इस सुविधा को वसंत की आवश्यकता है? जहाँ मैं @persistencecontext

@PersistenceContext(unitName = "manager1") 
private EntityManager entityManager; 

मेरी persistence.xml उपयोग करने के लिए

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
      version="2.0"> 
    <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 

     <properties> 

     <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     <property name="javax.persistence.jdbc.user" value="root"/> 
     <property name="javax.persistence.jdbc.password" value="mypassword"/> 
     <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/ptbrowserdb"/> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
     </properties> 
    </persistence-unit> 
</persistence> 
+0

क्या आप केवल निजी एक्सेस संशोधक ('EntityManager 'पर) और परीक्षण को हटा सकते हैं? – Santosh

उत्तर

10

यह आलेख देखें: JPA Architecture यह इसे बहुत अच्छी तरह से समझाता है।

सामान्य में आपको प्रति लेनदेन एक एकल इकाई प्रबंधक की आवश्यकता होती है। और इस इकाई प्रबंधक को एक ही समय में दो लेन-देन में उपयोग नहीं किया जाना चाहिए।

क्लेयरिफिकेशन: मेरा मतलब है, कार्यों की विभिन्न इकाई के लिए एक एकल इकाई प्रबंधक का उपयोग न करें। ठेठ एक लेन-देन के काम की एक इकाई में, अगर आप काम में से एक इकाई के विभिन्न लेन-देन है, तो आप एक ही इकाई प्रबंधक

उपयोग कर सकते हैं आप वसंत का उपयोग करते हैं तो यह आपके लिए स्प्रिंग से निपटने कर अगर आप @PersistenceContext एनोटेशन का उपयोग EntityManager इंजेक्षन करने के लिए। वर्तमान लेनदेन के लिए इंजेक्शन एंटीटी मैनेजर (प्रॉक्सी के माध्यम से) डिफ़ॉल्ट रूप से वसंत "बाध्य" करें। (और लेनदेन धागे के लिए "बाध्य" है।)

@ से Spring Reference 13.5.2 Implementing DAOs based on plain JPA - इसमें कोड उदाहरणों के बाद एक दिलचस्प अनुच्छेद शामिल है।

+0

लॉल नहीं हैं, आपको प्रति लेनदेन एक इकाई प्रबंधक की आवश्यकता नहीं है। एक इकाई प्रबंधक डेटाबेस में एक खुले सत्र (कनेक्शन) का प्रतिनिधित्व करता है, यह केवल एक लेनदेन के लिए इसका उपयोग करने के लिए बहुत महंगा है। 1 सत्र-प्रति-ऑपरेशन को एंटीपाटर माना जाता है! https://developer.jboss.org/wiki/Sessionsandtransactions – Maurice

+0

@ मॉरीस: यह एक दिलचस्प लेख है, लेकिन यह हाइबरनेट के "पुराने" सत्र/सत्र फैक्ट्री मॉडल के बारे में है, लेकिन यह सवाल जेपीए के बारे में है। किराया के रूप में मैं इसे दुर्लभ विषयों में से एक में जानता हूं जहां जेपीए और हाइबरनेट-सत्र अलग-अलग हैं। Https://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html/transactions.html में अध्याय "5.1। इकाई प्रबंधक और लेनदेन स्कोप" अध्याय पर एक नज़र डालें - यह दावा करता है: "एक EntityManager एक सस्ता है , गैर-थ्रेडसेफ ऑब्जेक्ट जिसे एक बार व्यवसाय प्रक्रिया के लिए, काम की एक इकाई के लिए इस्तेमाल किया जाना चाहिए, और फिर त्याग दिया जाना चाहिए। " – Ralph

+0

और एक एकल व्यापार प्रक्रिया में कई लेनदेन शामिल हो सकते हैं? या आप असहमत हैं। क्या वे मेरे लिंक में नहीं कहते हैं कि मुझे एक सत्र में एक और लेनदेन देना होगा अन्यथा यह एक एंटीपाटर होगा? – Maurice

1

आप एक निर्भरता की जरूरत प्रयास से (मैं, नल पॉइंटर एक्सेप्शन मिलता है क्योंकि यह इंजेक्शन कभी नहीं किया गया था) कोड की

स्निप वसंत या Google गुइस जैसे इंजेक्शन ढांचे को अपनी कक्षा में वस्तुओं को इंजेक्ट करने के लिए अन्यथा यह आपके लिए स्वचालित रूप से इंजेक्शन नहीं दिया जा सकता है।

असल में यह जेपीए द्वारा प्रदान की गई एक एनोटेशन है जो हाइबरनेट या किसी अन्य ओआरएम फ्रेमवर्क के साथ काम करेगा, लेकिन आपको वस्तुओं को इंजेक्ट करने के लिए डीआई फ्रेमवर्क की आवश्यकता है।

इकाई प्रबंधक के एक उदाहरण के बारे में मुझे नहीं लगता कि आपको स्प्रिंग से जाना होगा क्योंकि यह आपके इकाई प्रबंधक को जेपीए लेनदेन के साथ जोड़कर आपके लिए उदाहरणों और लेन-देन के प्रबंधन का ख्याल रखता है।

+1

जे 2 ईई में आपको किसी बाहरी निर्भरता इंजेक्शन ढांचे की आवश्यकता नहीं है। इंजेक्शन कंटेनर द्वारा संभाला जाता है। – Santosh

+0

आपको निर्भरता इंजेक्शन ढांचे की आवश्यकता नहीं है: आप इसे अपने आप कर सकते हैं: वेब अनुप्रयोग में उदाहरण के लिए इकाई प्रबंधक और एक EntityManagerPerRequestPatternFilter – Ralph

+0

@Ralph - हां मैं सहमत हूं कि हम खुद से इंजेक्शन कर सकते हैं लेकिन ओवरहेड से बचने के लिए हमारे पास DI..spring या guice के लिए सिद्ध ढांचे हैं जो हमारे लिए निर्बाध रूप से ऐसा करेंगे .. इन्हें इन्हें एप्लिकेशन स्टैक का हिस्सा होना चाहिए .. – raddykrish

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