Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LazyInitializationException(Spring和Vaadin),尽管有OpenEntityManagerView_Java_Spring_Hibernate_Jpa_Vaadin - Fatal编程技术网

Java LazyInitializationException(Spring和Vaadin),尽管有OpenEntityManagerView

Java LazyInitializationException(Spring和Vaadin),尽管有OpenEntityManagerView,java,spring,hibernate,jpa,vaadin,Java,Spring,Hibernate,Jpa,Vaadin,我将SpringRoo和Vaadin用于一个(简单的)数据库应用程序。有一个视图显示包含实体的表。对于要显示的表,Hibernate需要延迟加载1:n个引用实体。这适用于小表,但一旦表变大,只有第一部分正确显示,出现以下异常 com.vaadin.data.util.MethodProperty$MethodException at com.vaadin.data.util.MethodProperty.getValue(MethodProperty.java:612) at c

我将SpringRoo和Vaadin用于一个(简单的)数据库应用程序。有一个视图显示包含实体的表。对于要显示的表,Hibernate需要延迟加载1:n个引用实体。这适用于小表,但一旦表变大,只有第一部分正确显示,出现以下异常

com.vaadin.data.util.MethodProperty$MethodException
    at com.vaadin.data.util.MethodProperty.getValue(MethodProperty.java:612)
    at com.vaadin.data.util.AbstractProperty.toString(AbstractProperty.java:78)
    at com.vaadin.ui.Table.formatPropertyValue(Table.java:3476)
    at eu.wuttke.tinyscrum.ui.dashboard.DashboardTaskStoryTable.formatPropertyValue(DashboardTaskStoryTable.java:66)
    at com.vaadin.ui.Table.getPropertyValue(Table.java:3428)
    at com.vaadin.ui.Table.getVisibleCellsNoCache(Table.java:1853)
    at com.vaadin.ui.Table.refreshRenderedCells(Table.java:1477)
    at com.vaadin.ui.Table.enableContentRefreshing(Table.java:2645)
    at com.vaadin.ui.Table.changeVariables(Table.java:2491)
    at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.changeVariables(AbstractCommunicationManager.java:1455)
    at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariableBurst(AbstractCommunicationManager.java:1399)
    at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.handleVariables(AbstractCommunicationManager.java:1318)
    at com.vaadin.terminal.gwt.server.AbstractCommunicationManager.doHandleUidlRequest(AbstractCommunicationManager.java:763)
    at com.vaadin.terminal.gwt.server.CommunicationManager.handleUidlRequest(CommunicationManager.java:296)
    at com.vaadin.terminal.gwt.server.AbstractApplicationServlet.service(AbstractApplicationServlet.java:501)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:147)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
    at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
    at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)
    at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
    at java.lang.Thread.run(Thread.java:679)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.GeneratedMethodAccessor841.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:616)
    at com.vaadin.data.util.MethodProperty.getValue(MethodProperty.java:610)
    ... 34 more
Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
    at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
    at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
    at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
    at eu.wuttke.tinyscrum.domain.Iteration_$$_javassist_1.getName(Iteration_$$_javassist_1.java)
    at eu.wuttke.tinyscrum.domain.Iteration_Roo_JavaBean.ajc$interMethodDispatch1$eu_wuttke_tinyscrum_domain_Iteration_Roo_JavaBean$eu_wuttke_tinyscrum_domain_Iteration$getName(Iteration_Roo_JavaBean.aj)
    at eu.wuttke.tinyscrum.domain.TaskAndStory.getIterationName(TaskAndStory.java:32)
    ... 38 more
我从其他Hibernate应用程序中知道这个LazyInitializationException异常,它发生在会话未打开或已再次关闭时。但从堆栈跟踪来看,似乎调用了OpenEntityManagerView过滤器


有什么想法吗?非常感谢

Vaadin在服务器端具有持久状态。如果您将对象绑定到Vaadin组件(例如,通过使用
BeanItemContainer
),您的对象将在服务器端为多个请求“激活”

另一方面,Spring(通过
OpenEntityManagerInView
)将为每个请求创建一个新的EntityManager(
EntityManager
不安全),并在请求后关闭它。这样,您已经加载的
实体将分离(EM不再可用),并且当Vaadin发出新请求(例如加载更多表行)时,延迟加载文件将无法加载(并且您将获得
LazyInitializationException
),因为加载它们的EM不再存在

一些解决方案:

  • 使用急切的JPA获取(
    @ManyToOne(Fetch=FetchType.Eager)
  • 使用连接获取查询加载对象(例如,
    从杂志选择杂志杂志左连接获取杂志文章,其中杂志id=1
  • 使用EclipseLink(EclipseLink将打开一个新会话来加载分离对象的延迟加载字段)[我们使用这种方法]

这听起来不适用于这种情况,但如果对象未连接到当前会话,您也可以获得LazyInitializationException…非常感谢您的回答。事实上,你的解释很有道理。是否有可能使用Hibernate,仍然使用延迟加载?(比如将实体重新关联到新打开的会话?)也许我应该尝试一下EclipseLink(但目前,应用程序使用Hibernate,所以我希望在切换方面做一些工作)。@MatthiasWuttke您可以尝试使用。它需要一个Hibernate会话,但您可以使用Spring注入一个会话。