在我當前的項目中,這是基於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)
|| [...]
您可以看到會議BEC3759B529AC42AA7FFE62314633979
在09:59:32:504
關閉,但隨後將近一分鐘後重復使用。我的印象是,當UI.detatch()
被調用(如在日誌行2),UI實例不再使用,因爲會話過期(由於三個任務心跳)?我覺得我對Vaadin UI會話的生命週期有錯誤的想法。如果有人能夠幫我解釋一下這個話題,那會很好。
啊好吧,這說明了一點。我的印象是,vaadin會話基本上是一個瀏覽器連接(直到瀏覽器關閉),意味着一個cookie支持的會話。但你的回答暗示了一種完全不同的方法。 – Entrusc
因此,現在我更詳細地閱讀了你的答案,我想我現在明白了這個問題:我把所有的EM附加到了UI上,而我應該把它們附加到會話中。我沒有意識到UI和Session是兩個不同的東西 - 我認爲它們是一樣的。感謝您的回答! – Entrusc