जब आप प्रोटोटाइप स्कोप के रूप में एक बीन को परिभाषित करते हैं तो प्रत्येक स्थान के लिए एक नया उदाहरण बनाया जाता है, इसे इंजेक्शन देने की आवश्यकता होती है। इसलिए प्रत्येक डीएओ को सत्र का एक अलग उदाहरण मिलेगा, लेकिन डीएओ पर विधियों के सभी आमंत्रण एक ही सत्र का उपयोग कर समाप्त हो जाएंगे। चूंकि सत्र थ्रेड सुरक्षित नहीं है, इसलिए इसे कई धागे में साझा नहीं किया जाना चाहिए, यह एक मुद्दा होगा।
अधिकांश स्थितियों के लिए सत्र लेनदेन का दायरा होना चाहिए, यानी लेनदेन शुरू होने पर एक नया सत्र खोला जाता है और फिर लेनदेन समाप्त हो जाने के बाद स्वचालित रूप से बंद हो जाता है। कुछ मामलों में इसे दायरे के अनुरोध के लिए बढ़ाया जाना पड़ सकता है।
यदि आप सत्र Factory.currentSession का उपयोग करने से बचना चाहते हैं - तो आपको इसे प्राप्त करने के लिए अपने स्वयं के दायरे कार्यान्वयन को परिभाषित करने की आवश्यकता होगी।
यह ऐसा कुछ है जो पहले से ही जेपीए के लिए प्रॉक्सी का उपयोग कर लागू किया गया है। EntaManagerFactory के बजाय जेपीए EntityManager इंजेक्शन के मामले में है। @Autowired के बजाय एक नया @PersistenceContext एनोटेशन है। शुरुआत के दौरान प्रॉक्सी बनाया और इंजेक्शन दिया जाता है। जब किसी भी विधि को लागू किया जाता है तो प्रॉक्सी वास्तविक EntityManager कार्यान्वयन (SessionFactory.getCurrentSession के समान कुछ का उपयोग करके) को प्राप्त करेगा और इसे प्रतिनिधि करेगा।
इसी तरह की चीज हाइबरनेट के लिए भी लागू की जा सकती है, लेकिन अतिरिक्त जटिलता इसके लायक नहीं है। बेसडाओ में एक getSession विधि को परिभाषित करना बहुत आसान है जो आंतरिक रूप से सत्र Factory.getCurrentSession() को कॉल करता है। इसके साथ सत्र का उपयोग करने वाला कोड सत्र इंजेक्शन के समान है।
ही एक मामला पढ़ [दस्तावेज़] (http://docs.jboss.org/hibernate/orm/3.5/javadoc/org/hibernate/Session.html) जो कहते हैं 'सत्र एक अपवाद फेंकता है तो लेन-देन करना होगा वापस लुढ़काया और सत्र छोड़ दिया। सत्र की आंतरिक स्थिति डेटाबेस के साथ संगत के बाद अपवाद –
occurs.' नहीं हो सकता है आप 'सुई javax.persistence.EntityManager' बेहतर हैं, लेकिन उस के लिए, आप के बजाय जेपीए का उपयोग कर पर जोर पड़ता है। – Lion