2012-01-08 20 views
6

मैं नौकरी पोर्टल व्यवस्थापक बना रहा हूं। मैं वसंत + हाइबरनेट का उपयोग कर रहा हूँ। मैं ऐड नौकरी के लिए पेज बनाया है, यह ठीक काम कर रहा है, लेकिन जब मैं नौकरियों के संपादन के लिए एक ही पृष्ठ का उपयोग कर रहा है, यह मुझे अपवाद दे रहा है:हाइबरनेट और वसंत में कोई सत्र प्रॉक्सी

org.hibernate.LazyInitializationException: could not initialize proxy - no Session 
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:132) 
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:174) 
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190) 
    at com.jobs.admin.data.Company_$$_javassist_5.toString(Company_$$_javassist_5.java) 
    at org.springframework.util.ObjectUtils.nullSafeToString(ObjectUtils.java:560) 
    at org.springframework.util.ObjectUtils.getDisplayString(ObjectUtils.java:506) 
    at org.springframework.web.servlet.tags.form.SelectedValueComparator.exhaustiveCompare(SelectedValueComparator.java:178) 
    at org.springframework.web.servlet.tags.form.SelectedValueComparator.isSelected(SelectedValueComparator.java:103) 
    at org.springframework.web.servlet.tags.form.OptionTag.isSelected(OptionTag.java:243) 
    at org.springframework.web.servlet.tags.form.OptionTag.renderOption(OptionTag.java:211) 
    at org.springframework.web.servlet.tags.form.OptionTag.renderFromBodyContent(OptionTag.java:161) 
    at org.springframework.web.servlet.tags.form.AbstractHtmlElementBodyTag.doEndTag(AbstractHtmlElementBodyTag.java:66) 
    at org.apache.jsp.WEB_002dINF.jsp.admin.addJob_jsp._jspService(addJob_jsp.java:735) 
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393) 
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320) 
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654) 
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:445) 
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379) 
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292) 
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238) 
    at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250) 
    at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1060) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:798) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
    at java.lang.Thread.run 

(Thread.java:619) 

मेरे नियंत्रक वर्ग को जोड़ने के लिए दो विधि, एक चल रहा है नौकरी और नौकरी को संपादित करने के लिए एक। यह क्यों हो रहा है, कृपया कुछ सुझाव दें।

उत्तर

3

क्यों यह हो रहा है:

एक JSP में Company की toString विधि शुरू हो जाती है कि ऐसा लगता है। यह एक (कंपनी) ऑब्जेक्ट को लोड करने के लिए ट्रिगर करता है (यह केवल लेज़ लोड होता है)। क्योंकि आपके पास जेएसपी में हाइबरनेट सत्र नहीं है, इसलिए आपको यह त्रुटि मिलती है।

कुछ सुझाव दें:

  • बुरा सुझाव: का उपयोग उस वस्तु की, ताकि लोड हो रहा है लेन-देन के भीतर शुरू हो रहा है
  • वास्तविक सुझाव: उपयोग layzloading
  • अन्य बुरी सुझाव का प्रयोग नहीं करते एक OpenSessionInViewFilter या OpenEntityManagerInViewFilter
3

आपका इकाई (com.jobs.admin.data.Company) lazily आरंभ नहीं हो जाता। इसका मतलब है कि कुछ सदस्यों को वास्तव में प्रारंभ नहीं किया गया था, लेकिन हाइबरनेट ने इसके बजाय प्रॉक्सी लगाई और यह वास्तविक मूल्यों को मांग पर रखेगा।

इकाई को डेटाबेस से लोड करने के बाद, आप सत्र बंद कर देते हैं, इसलिए प्रॉक्सी-एड वाले सदस्य प्रारंभ नहीं किए गए थे! और अब आप com.jobs.admin.data.Company.toString() पर कॉल करते हैं जो प्रॉक्सी-एड वाले सदस्यों का उपयोग करता है। तो आप अपवाद प्राप्त करते हैं।

कुछ सुझाव: परतों में

  1. अलग अपने तर्क। यूआई परत पर सीधे अपनी इकाई वस्तुओं का पर्दाफाश न करें। एक बार आपके पास अलग-अलग ऑब्जेक्ट्स हो जाने के बाद, आपको इकाई से UI ऑब्जेक्ट में कॉपी करने की आवश्यकता होगी, आप इसे ओपन सत्र के दौरान करते हैं, इस प्रकार आपको यह अपवाद कभी नहीं प्राप्त करना चाहिए और सबकुछ अधिक स्पष्ट हो जाता है।
  2. toString() विधियों में आलसी लोड किए गए सदस्यों का कभी भी उपयोग न करें। toString() को काफी अप्रत्याशित रूप से कहा जा सकता है, उदाहरण के लिए लॉगिंग के दौरान और इसी तरह। इस समय के दौरान आपके पास कोई खुला सत्र नहीं है या नहीं, आपको शायद ही पता चलेगा।
संबंधित मुद्दे