2012-01-08 25 views
6

ジョブポータル管理者を作成しています。私は春+休止状態を使用しています。ジョブを追加するために、私はそれが正常に動作しているが、私は仕事の編集のために同じページを使用していたときに、それは私に例外を与えている、ページを作成しました:休止状態と春にセッションプロキシがありません

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つの方法で、1つを有するれます1つはそのジョブを編集するためのものです。なぜこれが起こっているのか、いくつか提案してください。

答えて

3

なぜこれが起こっている:

CompanytoStringメソッドが呼び出されるJSPでそのように見えます。これにより、(会社の)オブジェクトがロードされます(レイヤのみがロードされます)。 JSPで休止状態のセッションがないため、このエラーが発生します。

いくつかの提案を与える:

  • 悪い提案:
  • 他の悪い提案をlayzloading使用しないでください。使用:ロードはトランザクション内
  • 本当の提案をトリガーされるように、そのオブジェクトのアクセスa OpenSessionInViewFilterまたはOpenEntityManagerInViewFilter
3

エンティティ(com.jobs.admin.data.Company)が遅延初期化されています。つまり、一部のメンバーは実際には初期化されていませんが、代わりにHibernateはプロキシを置き、必要に応じて実際の値を設定します。

エンティティがデータベースからロードされた後で、セッションを閉じると、プロキシされたメンバーは初期化されませんでした。そして今、プロキシーされたメンバーを使用するcom.jobs.admin.data.Company.toString()に電話をかけます。だからあなたは例外を得る。

いくつかの提案:

  1. は層にあなたのロジックを分離します。エンティティオブジェクトを直接UIレイヤに公開しないでください。別のオブジェクトを作成したら、エンティティからUIオブジェクトにコピーする必要があります。オープンセッション中にそのオブジェクトを実行する必要があります。したがって、この例外は発生しないようにしてください。
  2. toString()メソッドで遅延ロードされたメンバーを使用しないでください。 toString()は、例えばロギング中など、かなり予期せずに呼び出すことができます。この間に開かれたセッションがあるかどうかはほとんど分かりません。