2012-01-08 170 views
6

我正在創建一個職位門戶管理員。我使用spring + hibernate。我已經創建了一個附加的工作頁面,它工作正常,但是當我使用的是相同的頁面進行作業的編輯,這是給我的例外:休眠和彈簧沒有會話代理

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被調用的CompanytoString方法。這會觸發一個(公司)對象加載(它只能被加載)。因爲在JSP中沒有hibernate會話,所以會出現此錯誤。

給出一些建議:

3

您的實體(com.jobs.admin.data.Company)被延遲初始化。這意味着一些成員並沒有真正初始化,但是Hibernate提供了一個代理服務器,它將會根據需要提供真實的值。

從數據庫加載實體後,關閉會話,因此被代理的成員未初始化!現在,您致電com.jobs.admin.data.Company.toString()使用被代理的成員。所以你會得到例外。

幾點建議:

  1. 獨立的邏輯分層。不要將實體對象直接暴露給UI層。一旦你有一個單獨的對象,你需要從實體複製到UI對象,你在開放會話期間這樣做,因此你永遠不應該得到這個異常,一切都變得更加清晰。
  2. 千萬不要在toString()方法中使用延遲加載的成員。例如在日誌記錄等過程中,可能會調用相當難以預測的toString()。在這段時間內,您幾乎不知道是否有公開會議。