您正在View Pattern 中寻找Open Session 。本质上,您希望在应用程序启动时将 Session 绑定到您的线程,并在应用程序的整个生命周期中使用相同的 Session。您可以通过创建一个像这样保持会话的单例 util 类来做到这一点(请注意,我使用的示例使用 anEntityManager
而不是 a Session
,但您的代码将基本相同):
private static EntityManager entityManager;
public static synchronized void setupEntityManager() {
if (entityManager == null) {
entityManager = entityManagerFactory.createEntityManager();
}
if (!TransactionSynchronizationManager.hasResource(entityManagerFactory)) {
TransactionSynchronizationManager.bindResource(entityManagerFactory, new EntityManagerHolder(entityManager));
}
}
public static synchronized void tearDownEntityManager() {
if (entityManager != null) {
if (entityManager.isOpen()) {
entityManager.close();
}
if (TransactionSynchronizationManager.hasResource(entityManagerFactory)) {
TransactionSynchronizationManager.unbindResource(entityManagerFactory);
}
if (entityManagerFactory.isOpen()) {
entityManagerFactory.close();
}
}
}
请注意,与 Open Session in View 模式相关的固有风险。例如,我在评论中注意到您打算在应用程序中使用线程。会话不是线程安全的。因此,您必须确保您没有尝试以线程方式访问数据库。*
您还必须更加了解您的集合获取策略。通过打开会话和延迟加载,您总是有可能在数据库上施加过多的负载。
*我以前在 NetBeans 应用程序中使用过这种方法,我知道它使用线程处理某些任务。我们从来没有遇到过任何问题,但是您需要注意风险,其中有很多。
编辑
根据您的情况,也可以从 Session 中驱逐您的域对象并缓存分离的对象以供以后使用。这种策略要求您的域对象不要经常更新,否则您的应用程序将变得不必要地复杂。