2012-01-08 57 views
6

Tôi đang tạo một quản trị cổng thông tin việc làm. Tôi đang sử dụng spring + hibernate. Tôi đã tạo trang để thêm công việc, nó hoạt động tốt, nhưng khi tôi đang sử dụng cùng một trang để chỉnh sửa công việc, nó cho tôi ngoại lệ:Không có proxy phiên nào trong hibernate và spring

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) 

Lớp điều khiển của tôi có hai phương pháp, một để thêm công việc và một để chỉnh sửa công việc đó. Tại sao điều này xảy ra, vui lòng đưa ra một số đề xuất.

Trả lời

3

Tại sao điều này xảy ra:

Hình như rằng trong một JSP phương pháp toString của Company được gọi. Điều này kích hoạt một đối tượng (công ty) để tải (nó chỉ là layz nạp). Bởi vì bạn không có một phiên ngủ đông trong JSP bạn nhận được lỗi này.

Cho một số gợi ý:

3

Thực thể của bạn (com.jobs.admin.data.Company) được khởi tạo lazily. Có nghĩa là một số thành viên đã không thực sự khởi tạo, nhưng Hibernate đặt một proxy thay vào đó và nó sẽ đưa các giá trị thực theo yêu cầu.

Sau khi thực thể được tải từ cơ sở dữ liệu, bạn đóng phiên, vì vậy các thành viên đã được proxy-ed, không được khởi tạo! Và bây giờ bạn gọi com.jobs.admin.data.Company.toString() sử dụng các thành viên đã được proxy-ed. Vì vậy, bạn nhận được ngoại lệ.

vài gợi ý:

  1. riêng logic của bạn thành các lớp. Không hiển thị đối tượng thực thể của bạn trực tiếp đến lớp giao diện người dùng. Một khi bạn có một đối tượng riêng biệt, bạn sẽ cần phải sao chép từ thực thể sang đối tượng UI, bạn làm điều đó trong phiên mở, do đó bạn sẽ không bao giờ nhận được ngoại lệ này và mọi thứ trở nên rõ ràng hơn.
  2. Không bao giờ sử dụng các thành viên tải lười trong các phương thức toString(). toString() có thể được gọi là khá không thể đoán trước, ví dụ như trong quá trình ghi nhật ký và vân vân. Bạn sẽ khó biết nếu bạn có một phiên mở trong thời gian này hay không.
Các vấn đề liên quan