2

(単純な) データベース アプリケーションに Spring Roo と 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

この LazyInitializationException 例外を他の Hibernate アプリケーションから知っています。この例外は、セッションが開かれていないか、すでに閉じられているときに発生します。しかし、スタック トレースを見ると、OpenEntityManagerInView フィルターが呼び出されているようです。

何か案は?どうもありがとう!

4

1 に答える 1

6

Vaadin は、サーバー側で永続的な状態を保持します。オブジェクトを Vaadin コンポーネントにバインドすると (たとえば、 を使用してBeanItemContainer)、オブジェクトはサーバー側で複数の要求に対して「有効」になります。

一方、Spring は ( 経由でOpenEntityManagerInView) リクエストごとに新しい EntityManager を作成し (EntityManagersスレッドセーフではありません)、リクエスト後にそれを閉じます。このようにして、すでにロードEntitiesされているものは切り離され (EM は利用できなくなります)、Vaadin が新しい要求を作成して、たとえばテーブル行をさらにロードすると、遅延ロード フィールドはロードできなくなります (そして、 を取得しますLazyInitializationException)。それらをロードした EM はもう存在しません。

いくつかの解決策:

  • Eager JPA Fetch を使用する ( @ManyToOne (fetch= FetchType.EAGER))
  • JOIN FETCH クエリを使用してオブジェクトをロードします (例: SELECT mag FROM Magazine mag LEFT JOIN FETCH mag.articles WHERE mag.id = 1 See more )
  • EclipseLink を使用します (EclipseLink は、デタッチされたオブジェクトの遅延読み込みフィールドをロードするために新しいセッションを開きます) [このアプローチを使用しています]
于 2012-09-10T10:17:53.057 に答える