Java 在Swing应用程序中使用Hibernate进行会话管理

Java 在Swing应用程序中使用Hibernate进行会话管理,java,database,hibernate,swing,session,Java,Database,Hibernate,Swing,Session,如何在Java桌面Swing应用程序中进行Hibernate会话管理?您使用单一会话吗?多个会话 以下是有关该主题的一些参考资料: 单个会话。当您需要执行一组操作(如对话框“确定”按钮后更新数据)时,启动事务,最后提交发送。尽管连接一直是开放的(因为它是同一个会话),因此Hib和RDBMS都可以使用所有缓存机会 在连接断开的情况下,实现透明的会话重新打开也是一个好主意——用户倾向于让应用程序长时间保持打开状态,即使DB服务器在周末重新启动,它也应该在周一继续工作 更新 Jens Scha

如何在Java桌面Swing应用程序中进行Hibernate会话管理?您使用单一会话吗?多个会话

以下是有关该主题的一些参考资料:


单个会话。当您需要执行一组操作(如对话框“确定”按钮后更新数据)时,启动事务,最后提交发送。尽管连接一直是开放的(因为它是同一个会话),因此Hib和RDBMS都可以使用所有缓存机会

在连接断开的情况下,实现透明的会话重新打开也是一个好主意——用户倾向于让应用程序长时间保持打开状态,即使DB服务器在周末重新启动,它也应该在周一继续工作

更新

Jens Schauder提供了使用多个会话的理由:对会话进行部分(不需要的)更新。好吧,这取决于你使用Hibernate的方式

假设我们打开了两个对话框(如Jens的博客示例)。若用户单击radiobox,我们立即更新与此radiobox关联的Hibernate实体,那个么,当用户单击Cancel时,我们就麻烦了——会话已经更新了

在我看来,正确的方法是只更新对话框变量(非休眠对象)。然后,当用户单击OK时,我们开始一个事务,合并更新的对象,提交事务。没有垃圾被保存到会话中

MyHibernateUtils.begin();
Settings settings = DaoSettings.load();
// update setttings here
DaoSettings.save(settings);
MyHibernateUtils.commit(); 
如果我们实现了这样一个清晰的关注点分离,我们可以稍后通过简单的MyHibernateUtils.begin()实现更改切换到多个会话


至于可能的内存泄漏,那么。。。Transaction.commit()调用Session.flush(),后者也会清理缓存。此外,可以通过调用Session.setCacheMode()手动控制缓存策略。

不要使用单个会话。对于除最小的应用程序以外的所有应用程序,它都会增长,收集过时的数据,并且变得越来越慢,因为脏检查需要检查会话中的每个实体

如果您不需要/不希望通过Hibernate延迟加载和跟踪更改,那么可以使用短期会话

但如果您想从Hibernate的强大功能中获益,请使用我在博客中描述的方法:

或德语版本:

AFAIK这实际上与中描述的方法相同,但建议如何实际确定会话范围: 在每帧会话上,使用父帧会话的模态帧除外

只需确保永远不要组合来自不同会话的对象。这会引起很多麻烦

作为对弗拉基米尔最新情况的答复:

  • 取消实际上对我的方法非常有效:扔掉会话
  • session.flush无法解决在使用应用程序的单个会话时evergrowing会话的问题。当然,使用这种方法,您可以描述您可以使用短期会话,这应该可以正常工作。但是
  • 你会损失很多:延迟加载只适用于附加对象,自动检测脏对象。如果使用分离的对象(或根本不是实体的对象),则必须自己执行此操作

每个线程使用一个会话()和一个版本或时间戳列,以允许乐观并发,从而避免会话到实例的冲突。需要时将实例附加到会话,除非您需要长时间运行的事务或限制性的隔离级别。

好的Swing应用程序在EDT之外(通常在新创建的SwingWorker线程中)进行数据库访问,“每个线程会话”的问题在于。这样,“每线程会话”很快就变成了“每次单击会话”

在swing应用程序中,基本上所有事情都发生在一个线程中。因此,这可以归结为应用程序的单个会话,但存在文档缺陷。如何处理连接超时?示例:用户打开一个编辑器,可以在其中修改实体。编辑器未关闭或实体已保存(用户将编辑器保持打开状态,并前往周末)。现在连接超时出现。。。如何使用JPAAPI处理这个问题?是否重新打开EntityManager并合并实体?