Нет сессионного прокси в спящем и весеннем - PullRequest
6 голосов
/ 08 января 2012

Я создаю работу администратора портала. Я использую весну + спящий режим. Я создал страницу для добавления работы, она работает нормально, но когда я использую ту же страницу для редактирования работ, это дает мне исключение:

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)

В моем классе контроллеров есть два метода: один для добавления задания и один для редактирования этого задания. Почему это происходит, дайте несколько советов.

Ответы [ 2 ]

3 голосов
/ 08 января 2012

Ваша сущность (com.jobs.admin.data.Company) инициализируется лениво. Это означает, что некоторые члены на самом деле не были инициализированы, но вместо этого Hibernate установил прокси, и он будет выставлять реальные значения по запросу.

После того, как объект загружен из базы данных, вы закрываете Сессию, поэтому члены, которые были прокси-объектами, не были инициализированы! И теперь вы звоните com.jobs.admin.data.Company.toString(), который использует членов, которые были прокси-ред. Таким образом, вы получите исключение.

Несколько предложений:

  1. Разделите свою логику на слои. Не открывайте свои объекты прямо на уровне пользовательского интерфейса. Когда у вас есть отдельные объекты, вам нужно скопировать их из объекта в объект пользовательского интерфейса, вы делаете это во время открытого сеанса, поэтому вы никогда не должны получать это исключение, и все становится более понятным.
  2. Никогда не используйте ленивые загруженные элементы в toString() методах. toString() может вызываться совершенно непредсказуемо, например, во время регистрации и так далее. Вы вряд ли узнаете, будет ли у вас открытая сессия в это время или нет.
3 голосов
/ 08 января 2012

Почему это происходит:

Похоже, что в JSP вызывается toString метод Company.Это запускает объект (компания) для загрузки (загружается только layz).Поскольку у вас нет сеанса гибернации в JSP, вы получаете эту ошибку.

Дайте несколько советов:

  • плохое предложение: не используйте layzloading
  • другое плохоепредложение: доступ к этому объекту, так что загрузка запускается в транзакции
  • реальное предложение: используйте OpenSessionInViewFilter или OpenEntityManagerInViewFilter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...