There is no session proxy in sleep mode and spring

I am creating a job portal administrator. I am using spring + hibernate. I created a page for adding a task, it works fine, but when I use the same page for editing tasks, it gives me an exception:

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) 

My controller class has two methods: one for adding a task and one for editing this work. Why is this happening, please give some advice.

+6
source share
2 answers

Why is this happening:

It looks like the toString Company method is being called in the JSP. This runs the object (company) to load (it is loaded only with layz). Since you do not have a sleep mode session in the JSP, you are getting this error.

Give some tips:

+3
source

Your organization ( com.jobs.admin.data.Company ) is initialized lazily. This means that some members were not initialized, but Hibernate installed a proxy instead, and it will put real values ​​on demand.

After the entity is loaded from the database, you close the session, so the members that were approximated were not initialized! And now you call com.jobs.admin.data.Company.toString() , which uses members that have been com.jobs.admin.data.Company.toString() . This way you get an exception.

A few suggestions:

  • Divide your logic into layers. Do not expose objects from objects to objects directly at the user interface level. After you have separate objects, you will need to copy from the object to the user interface object, you do this during an open session, so you should never get this exception, and everything becomes more clear.
  • Never use lazy loaded items in toString() methods. toString() can be called quite unpredictable, for example, during logging, etc. You are unlikely to find out if you have an open session during this time or not.
+3
source

Source: https://habr.com/ru/post/905445/


All Articles