2016-03-01 69 views
0

在我當前的項目中,這是基於Vaadin 7.6.2,我得到一個錯誤,我根本找不到在我的代碼中的解釋。在這個應用程序中,我爲UI會話打開了一堆EntityManagers,然後在會話被分離時(當調用UI.detatch()時)關閉它們。現在我的問題是,我的日誌清楚地表明會話被分開,然後再次使用。 AFAIK這不應該發生,對吧?Vaadin 7 UI會話過早關閉

下面是從日誌文件中excerp:

***  || 29.02.2016 09:59:32:504 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | de.darkblue.bagheera.db.EntityManagerBeanFactory.closeAll() 
     || Closed 3 entity managers for session a******.i**** 

***  || 29.02.2016 09:59:32:504 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | de.darkblue.bagheera.BagheeraUI.detach() 
     || Session [email protected] was detatched. 

[...] 
      
!!!! || 29.02.2016 10:00:21:159 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | com.vaadin.server.DefaultErrorHandler.doDefault() 
     ||  caused by: 
     || java.lang.IllegalStateException: Attempting to execute an operation on a closed EntityManager. 
     ||         at org.eclipse.persistence.internal.jpa.EntityManagerImpl.verifyOpenWithSetRollbackOnly(EntityManagerImpl.java:1934) 
     ||         at org.eclipse.persistence.internal.jpa.EntityManagerImpl.getCriteriaBuilder(EntityManagerImpl.java:2569) 
     ||         at de.darkblue.bagheera.ui.tab.EditActivityReportTab.isOverlappingEntry(EditActivityReportTab.java:383) 
     ||         [...] 

您可以看到會議BEC3759B529AC42AA7FFE6231463397909:59:32:504關閉,但隨後將近一分鐘後重復使用。我的印象是,當UI.detatch()被調用(如在日誌行2),UI實例不再使用,因爲會話過期(由於三個任務心跳)?我覺得我對Vaadin UI會話的生命週期有錯誤的想法。如果有人能夠幫我解釋一下這個話題,那會很好。

回答

1

我不確定你正在打印什麼會話並參考那裏。

我想你知道這個,但你有HttpSession擁有一個VaadinSession對象,其中包含多個UI對象。如果有任何聽起來很有趣,我想你會覺得這很有幫助 - how to put data in session variable and get the data in different page in vaadin?

但是,我的感覺是,你要重新審視自己的EntityManager生命週期 - 看到https://vaadin.com/docs/-/part/framework/jpacontainer/jpacontainer-hibernate.html

雖然,其他人主張的EM-每個會話方法,如在這裏看到 - Save changes to database vaadin

這一切都表示,同樣的VaadinSession絕對可以用於多個用戶界面,事實上,您會在VaadinSession中看到一個名爲uIs的地圖。現在,您似乎每個瀏覽器窗口都會得到一個新的VaadinSession,但從同一個窗口實例化多個UI對象並不困難,並且它們將共享相同的VaadinSession

最後值得注意的是,大多數常規設置在瀏覽器實例中的所有窗口中也將有單個HttpSession

+0

啊好吧,這說明了一點。我的印象是,vaadin會話基本上是一個瀏覽器連接(直到瀏覽器關閉),意味着一個cookie支持的會話。但你的回答暗示了一種完全不同的方法。 – Entrusc

+0

因此,現在我更詳細地閱讀了你的答案,我想我現在明白了這個問題:我把所有的EM附加到了UI上,而我應該把它們附加到會話中。我沒有意識到UI和Session是兩個不同的東西 - 我認爲它們是一樣的。感謝您的回答! – Entrusc