सबसे पहले, आपको यह समझना चाहिए कि समस्या की जड़ लेन-देन नहीं है। हमारे पास एक लेनदेन और एक सतत संदर्भ (सत्र) है। @Transactional
. के साथ एनोटेशन स्प्रिंग एक लेन-देन बनाता है और लगातार संदर्भ खोलता है। विधि लागू होने के बाद एक सतत संदर्भ बंद हो जाता है।
जब आप user.getUserAccount()
. को कॉल करते हैं आपके पास एक प्रॉक्सी वर्ग है जो UserAccount
. को लपेटता है (यदि आप UserAccount
लोड नहीं करते हैं User
. के साथ ) तो जब एक सतत संदर्भ बंद हो जाता है, तो आपके पास LazyInitializationException
. होता है UserAccount
. के किसी भी तरीके की कॉल के दौरान , उदाहरण के लिए user.getUserAccount().toString()
।
@Transactional
केवल userService
. पर काम कर रहा है स्तर, आपके मामले में। @Transactional
get प्राप्त करने के लिए काम, यह @Transactional
. डालने के लिए पर्याप्त नहीं है एक विधि पर टिप्पणी। आपको Spring Context
. से विधि के साथ एक वर्ग का ऑब्जेक्ट प्राप्त करने की आवश्यकता है . इसलिए पैसे को अपडेट करने के लिए आप किसी अन्य सेवा पद्धति का उपयोग कर सकते हैं, उदाहरण के लिए updateMoney(userId, amount)
।
यदि आप @Transactional
. का उपयोग करना चाहते हैं नियंत्रक विधि पर आपको Spring Context
. से नियंत्रक प्राप्त करने की आवश्यकता है . और स्प्रिंग को समझना चाहिए, कि उसे हर @Transactional
. को लपेटना चाहिए एक सतत संदर्भ को खोलने और बंद करने के लिए एक विशेष विधि के साथ विधि। दूसरा तरीका सत्र प्रति अनुरोध विरोधी पैटर्न का उपयोग करना है। आपको एक विशेष HTTP फ़िल्टर जोड़ना होगा।
https://vladmihalcea.com/the-open-session- इन-व्यू-एंटी-पैटर्न/