दिलचस्प पोस्ट
स्ट्रिंग से एक्सटेंशन कैसे निकालें (केवल वास्तविक एक्सटेंशन!) जावास्क्रिप्ट में 2 तिथियों के बीच अंतर हो सकता है? जावा – विशाल (अतिरिक्त बड़े) JSON फ़ाइल को पार्स करने के लिए सर्वश्रेष्ठ तरीका IE8 में AJAX के परिणामों का अप्रत्याशित कैशिंग SQL में यादृच्छिक पंक्ति का अनुरोध कैसे करें? यह कैसे पता लगाएगा कि मेरा एप्लिकेशन वर्चुअल मशीन में चल रहा है या नहीं? <Mutex> का उपयोग किए बिना मल्टीथ्रेड सुरक्षित सिंगलटन को सी ++ 11 में कैसे कार्यान्वित करें IntelliJ में Intellisense अब काम नहीं करते HttpPost बनाम एचटीटीपीएजीटी एमवीसी में विशेषताएँ: एचटीटीपी पोस्ट का उपयोग क्यों करें? N भूखंडों में n संख्यात्मक चर के विरुद्ध एक संख्यात्मक चर का प्लॉट SecurityException फेंके बिना रनटाइम पर अनुमति की जांच कैसे की जा सकती है? कैसे प्रवेश 2010 में UNPIVOT अनुकरण करने के लिए? PHP पार्स HTML कोड VBA में कन्स्ट्रक्टर को तर्क दें डबल। समानता के लिए एप्सिलॉन, से बड़ा, कम से कम, या उसके बराबर या उससे अधिक के बराबर

org.hibernate.LazyInitializationException – प्रॉक्सी प्रारंभ नहीं कर सका – कोई सत्र नहीं

मुझे निम्नलिखित अपवाद मिलता है:

Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167) at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215) at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190) at sei.persistence.wf.entities.Element_$$_jvstc68_47.getNote(Element_$$_jvstc68_47.java) at JSON_to_XML.createBpmnRepresantation(JSON_to_XML.java:139) at JSON_to_XML.main(JSON_to_XML.java:84) 

जब मैं मुख्य लाइनों से कॉल करने की कोशिश करता हूं:

 Model subProcessModel = getModelByModelGroup(1112); System.out.println(subProcessModel.getElement().getNote()); 

मैंने सबसे पहले getModelByModelGroup(int modelgroupid) विधि को लागू किया है:

  public static Model getModelByModelGroup(int modelGroupId, boolean openTransaction) { Session session = SessionFactoryHelper.getSessionFactory().getCurrentSession(); Transaction tx = null; if (openTransaction) tx = session.getTransaction(); String responseMessage = ""; try { if (openTransaction) tx.begin(); Query query = session.createQuery("from Model where modelGroup.id = :modelGroupId"); query.setParameter("modelGroupId", modelGroupId); @SuppressWarnings("unchecked") List<Model> modelList = (List<Model>)query.list(); Model model = null; // Cerco il primo Model che è in esercizio: idwf_model_type = 3 for (Model m : modelList) if (m.getModelType().getId() == 3) { model = m; break; } if (model == null) { Object[] arrModels = modelList.toArray(); if (arrModels.length == 0) throw new Exception("Non esiste "); model = (Model)arrModels[0]; } if (openTransaction) tx.commit(); return model; } catch(Exception ex) { if (openTransaction) tx.rollback(); ex.printStackTrace(); if (responseMessage.compareTo("") == 0) responseMessage = "Error" + ex.getMessage(); return null; } 

और अपवाद मिला तब एक मित्र ने मुझे हमेशा इस सत्र का परीक्षण करने और इस त्रुटि से बचने के लिए मौजूदा सत्र प्राप्त करने का सुझाव दिया। तो मैंने ऐसा किया:

 public static Model getModelByModelGroup(int modelGroupId) { Session session = null; boolean openSession = session == null; Transaction tx = null; if (openSession){ session = SessionFactoryHelper.getSessionFactory().getCurrentSession(); tx = session.getTransaction(); } String responseMessage = ""; try { if (openSession) tx.begin(); Query query = session.createQuery("from Model where modelGroup.id = :modelGroupId"); query.setParameter("modelGroupId", modelGroupId); @SuppressWarnings("unchecked") List<Model> modelList = (List<Model>)query.list(); Model model = null; for (Model m : modelList) if (m.getModelType().getId() == 3) { model = m; break; } if (model == null) { Object[] arrModels = modelList.toArray(); if (arrModels.length == 0) throw new RuntimeException("Non esiste"); model = (Model)arrModels[0]; if (openSession) tx.commit(); return model; } catch(RuntimeException ex) { if (openSession) tx.rollback(); ex.printStackTrace(); if (responseMessage.compareTo("") == 0) responseMessage = "Error" + ex.getMessage(); return null; } } 

लेकिन अभी भी एक ही त्रुटि मिलती है मैं इस त्रुटि के लिए बहुत कुछ पढ़ रहा हूं और कुछ संभावित समाधान पाया। उनमें से एक झूठ के लिए आलसी लोड सेट करना था, लेकिन मुझे ऐसा करने की अनुमति नहीं है क्योंकि मुझे सत्र को नियंत्रित करने का सुझाव दिया गया था

वेब के समाधान से एकत्रित समाधान "org.hibernate.LazyInitializationException – प्रॉक्सी प्रारंभ नहीं कर सका – कोई सत्र नहीं"

यहाँ क्या गलत है यह है कि जब आप लेनदेन करते हैं तो सत्र प्रबंधन कॉन्फ़िगरेशन को सत्र बंद करने के लिए सेट किया जाता है जांचें कि आपके पास कुछ ऐसा है:

 <property name="current_session_context_class">thread</property> 

आपके कॉन्फ़िगरेशन में

इस समस्या को दूर करने के लिए आप सत्र कारखाने के कॉन्फ़िगरेशन को बदल सकते हैं या एक और सत्र खोल सकते हैं और केवल उन आलसी लोड किए गए ऑब्जेक्ट के लिए पूछ सकते हैं। लेकिन मैं यहाँ क्या सुझाव दूंगा GetmodelByModelGroup में ही इस आलसी संग्रह को प्रारंभ करने और कॉल करने के लिए:

 Hibernate.initialize(subProcessModel.getElement()); 

जब आप अभी भी सक्रिय सत्र में हैं

और एक आखिरी चीज एक दोस्ताना सलाह आपके पास ऐसा कुछ है जो आपकी विधि में है:

  for (Model m : modelList) if (m.getModelType().getId() == 3) { model = m; break; } 

कृपया इस कोड का इंस्टॉलेशन सिर्फ उन मॉडलों को टाइप करें जिसमें टाइप इमेज 3 के साथ मॉडल आईडी क्वेरी स्टेटमेंट में ऊपर दिए गए दो पंक्तियों में शामिल हों

कुछ और पढ़ना:

सत्र कारखाने विन्यास

बंद सत्र के साथ समस्या

आप सेट करने का प्रयास कर सकते हैं

 <property name="hibernate.enable_lazy_load_no_trans">true</property> 

hibernate.cfg.xml या persistence.xml में

इस संपत्ति के साथ ध्यान में रखने की समस्या को यहाँ समझाया गया है

यदि आप स्प्रिंग को @ ट्रान्सैक्शनिकल के रूप में क्लास का इस्तेमाल करते हैं, तो स्प्रिंग सत्र प्रबंधन को संभालना होगा

 @Transactional public class My Class { ... } 

@Transactional लेनदेन का उपयोग करके, लेनदेन प्रचार जैसे कई महत्वपूर्ण पहलुओं को स्वचालित रूप से संभाला जाता है। इस मामले में यदि एक अन्य ट्रांसेक्शनल विधि को कहा जाता है तो विधि "बिना सत्र" अपवाद से बचने के चल रहे लेनदेन में शामिल होने का विकल्प होगा।

LazyInitializationException को संभालने का सबसे अच्छा तरीका JOIN FETCH निर्देश का उपयोग करना है:

 Query query = session.createQuery( "from Model m " + "join fetch m.modelType " + "where modelGroup.id = :modelGroupId" ); 

फिर भी, कुछ एंटी-पैटर्न का उपयोग न करें, जैसा कि कुछ उत्तरों से सुझाव दिया गया है:

  • दृश्य में ओपन सत्र
  • hibernate.enable_lazy_load_no_trans

कभी-कभी, एक डीटीओ प्रक्षेपण संस्थाओं को लाने से बेहतर विकल्प होता है, और इस तरह, आपको कोई LazyInitializationException नहीं मिलेगा।

मुझे एक ही समस्या का सामना करना पड़ा। मुझे लगता है कि इसे ठीक करने का एक अन्य तरीका यह है कि आप मॉडल से अपनी एलिमेंट को लाने के लिए क्वेरी को बदल सकते हैं:

 Query query = session.createQuery("from Model m join fetch m.element where modelGroup.id = :modelGroupId") 

यह अपवाद क्योंकि जब आप session.getEntityById() कॉल करते हैं, तो सत्र बंद हो जाएगा। तो आपको संस्था को इकाई को फिर से जोड़ना होगा। या आसान समाधान सिर्फ अपनी entity.hbm.xml default-lazy="false" entity.hbm.xml या यदि आप एनोटेशन का उपयोग कर रहे हैं तो बस अपनी संस्था वर्ग में @Proxy(lazy=false) को जोड़ें।

यहां कई अच्छे उत्तर दिए गए हैं जो इस त्रुटि को एक व्यापक दायरे में हैं। मैं स्प्रिंग सिक्योरिटी के साथ एक विशिष्ट स्थिति में गया जो एक त्वरित था, हालांकि संभवतः इष्टतम नहीं, ठीक।

उपयोगकर्ता प्राधिकरण (प्रमाणीकरण में प्रवेश करने और उत्तीर्ण करने के तुरंत बाद) के दौरान मैं एक विशिष्ट इकाई के लिए एक कस्टम इकाई में एक उपयोगकर्ता इकाई का परीक्षण कर रहा था जो SimpleUrlAuthenticationSuccessHandler तक फैलता है।

मेरा उपयोगकर्ता अस्तित्व UserDetails लागू करता है और आलसी भरी हुई भूमिकाओं का सेट करता है जिससे "org.hibernate.LazyInitializationException- प्रॉक्सी प्रारंभ नहीं कर सका – कोई सत्र नहीं" अपवाद "Fetch = FetchType.LAZY" से "Fetch = FetchType.EAGER" को सेट करने के लिए मेरे लिए यह तय किया गया है।

यदि आप Grail's फ्रेमवर्क Grail's उपयोग कर रहे हैं, तो डोमेन श्रेणी में विशिष्ट फ़ील्ड पर Lazy कीवर्ड का उपयोग करके आलसी प्रारंभिक अपवाद को हल करना सरल है।

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

 class Book { static belongsTo = [author: Author] static mapping = { author lazy: false } } 

यहां अधिक जानकारी प्राप्त करें

यदि आप JPQL का उपयोग कर रहे हैं, JOIN FETCH का उपयोग सबसे आसान तरीका है: http://www.objectdb.com/java/jpa/query/jpql/from#LEFT_OUTER_INNER_JOIN_FETCH_

नीचे टिप्पणी के लिए एक से कई रिश्तों के लिए मुझे एक ही त्रुटि मिल रही थी

 @OneToMany(mappedBy="department", cascade = CascadeType.ALL) 

Fetch = FetchType.EAGER को जोड़ने के बाद नीचे के रूप में परिवर्तित किया गया, यह मेरे लिए काम किया है

 @OneToMany(mappedBy="department", cascade = CascadeType.ALL, fetch=FetchType.EAGER) 

आप अपने * .hbm.xml फ़ाइल में आलसी = झूठे जोड़कर भी इसे हल कर सकते हैं या जब आप ऑब्जेक्ट को डीबी से प्राप्त करते हैं, तो आप अपने ऑब्जेक्ट को हाइबर्नेट में डालेंगे (ऑब्जेक्ट)

session.get (*। वर्ग, आईडी) का उपयोग करता है; लेकिन फ़ंक्शन लोड नहीं करें

Servlet-context.xml में निम्न परिवर्तन करें

  <beans:property name="hibernateProperties"> <beans:props> <beans:prop key="hibernate.enable_lazy_load_no_trans">true</beans:prop> </beans:props> </beans:property>