简体   繁体   English

在hibernate和spring中没有会话代理

[英]No session proxy in hibernate and spring

I am creating a job portal admin. 我正在创建一个职位门户管理员。 I am using spring + hibernate. 我正在使用spring + hibernate。 I have created page for add job, it is working fine, but when i am using the same page for edit of jobs , it is giving me 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 is having two method, one for adding job and one for edit that job. 我的控制器类有两个方法,一个用于添加作业,一个用于编辑该作业。 Why this is happening , please give some suggestions. 为什么会这样,请提出一些建议。

Why this is happening: 为什么会这样:

Looks like that in a JSP the toString method of Company is invoked. 看起来在JSP中调用了CompanytoString方法。 This triggers a (company) object to load (it is only layz loaded). 这会触发(公司)对象加载(它只是layz加载)。 Because you do not have a hibernate session in the JSP you get this error. 因为JSP中没有hibernate会话,所以会出现此错误。

Give some suggestions: 提出一些建议:

Your entity ( com.jobs.admin.data.Company ) is lazily initialized. 你的实体( com.jobs.admin.data.Company )被懒惰地初始化了。 Meaning that some members were not really initialized, but Hibernate put a proxy instead and it is going to put the real values on demand. 这意味着一些成员并没有真正初始化,但Hibernate代替了代理,它将按需提供真正的价值。

After the entity is loaded from the database, you close the Session, so the members that were proxy-ed, were not initialized! 从数据库加载实体后,关闭会话,因此代理编辑的成员未初始化! And now you call com.jobs.admin.data.Company.toString() that uses members that were proxy-ed. 现在,您调用com.jobs.admin.data.Company.toString() ,它使用代理编辑的成员。 So you get the exception. 所以你得到了例外。

Few suggestions: 几点建议:

  1. Separate your logic into layers. 将您的逻辑分成几层。 Don't expose your entity objects directly to UI layer. 不要将实体对象直接暴露给UI层。 Once you have a separate objects, you'll need to copy from entity to the UI object, you do it during the open session, thus you should never get this exception and everything becomes more clear. 一旦你有一个单独的对象,你需要从实体复制到UI对象,你在开放会话期间这样做,因此你永远不会得到这个例外,一切都变得更加清晰。
  2. Never use lazy loaded members in toString() methods. 切勿在toString()方法中使用延迟加载的成员。 toString() may be called quite unpredictably, for example during logging and so on. 可能会非常不可预测地调用toString() ,例如在日志记录期间等。 You will hardly know if you have an open session during this time or not. 你很难知道你在这段时间内是否有开放的会议。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM