在我目前的项目中,基于<nav class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="file:///C:/Users/Maria/Desktop/Vale%26Andrea/indexVA.html" class="navbar-left"><img src="images/cuori.png" height="42" alt="Valentina e Andrea" title="Valentina e Andrea">Valentina e Andrea</a>
</div>
<div class="collapse navbar-collapse" id="myNavbar">
<ul class="nav navbar-nav navbar-right">
<li><a href="noi.html" target="_blank">Noi</a></li>
<li><a href="#">Il Grande Giorno</a></li>
<li><a href="#">Lista Nozze</a></li>
<li><a href="https://docs.google.com/forms/d/1C2kx4ete4K7238-VPHktfyCymZJqh-FjWh2fstvgy3g/viewform" target="_blank">Scrivici!</a></li>
</ul>
</div><!--/.nav-collapse -->
</div>
</nav>
<!-- Main jumbotron for a primary marketing message or call to action -->
<div class="jumbotron">
<div class="container">
<h1>Auguri a <a href="noi.html" target="_blank" role="button"> NOI! </a></h1>
</div>
</div>
,我收到一个错误,我在代码中找不到解释。在这个应用程序中,我为一个UI会话打开了一堆EntityManagers,然后在会话被分离时(当调用Vaadin 7.6.2
时)关闭它们。现在我的问题是我的日志清楚地说明会话被分离然后再次使用。 AFAIK这不应该发生,对吗?
以下是日志文件的摘录:
UI.detatch()
您可以看到会话*** || 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 de.darkblue.bagheera.BagheeraUI@1c5c5ab2 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
时(如在日志行2中),UI实例不再使用,因为会话已过期(由于三个任务心跳)?我觉得我对Vaadin UI会话的生命周期有错误的想法。如果有人可以帮助我阐明这个话题,那就太好了。
答案 0 :(得分: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-per-session 方法,如此处所见 - Save changes to database vaadin。
总而言之,相同的VaadinSession
绝对可以用于多个用户界面,实际上您会在uIs
中看到名为VaadinSession
的地图。现在,您似乎每个浏览器窗口都有一个新的VaadinSession
,但是从同一个窗口实例化多个UI
对象并不困难,并且它们将共享相同的{{1} }。
最后值得注意的是,大多数正常设置在浏览器实例的所有窗口中也会有单VaadinSession
。