Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

LazyInitializationException आलसी आरंभिक उदाहरण प्राप्त करने का प्रयास कर रहा है

सबसे पहले, आपको यह समझना चाहिए कि समस्या की जड़ लेन-देन नहीं है। हमारे पास एक लेनदेन और एक सतत संदर्भ (सत्र) है। @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- इन-व्यू-एंटी-पैटर्न/



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कुप्पी-SQLAlchemy:अमान्य लेन-देन वापस रोल किए जाने तक पुन:कनेक्ट नहीं किया जा सकता

  2. रैंड द्वारा आदेश () विकल्प

  3. 2 समय मान जोड़ने के साथ भ्रम

  4. होमब्रे, MySQL 8 सपोर्ट

  5. क्या मैं साझा होस्टिंग पर ft_min_word_len बदल सकता हूँ?