当前位置: 首页 > 知识库问答 >
问题:

单个Hibernate会话中的多个事务(使用Spring)

梅宏盛
2023-03-14

是否可以使用Hibernate Spring对以下内容进行建模。

  • 公开会议

我使用Spring TransactionTemplate,它同时执行会话事务生存期范围。

原因是,有时我在业务流程中有几个阶段,我希望在每个阶段完成后提交。但是,我希望继续使用相同的持久对象。如果每个事务都有一个单独的会话,则会出现暂时/分离的异常,因为原始会话已关闭。

这有可能吗?

共有2个答案

闾丘德业
2023-03-14

您可以使用OpenSessionInView模式实现这一点。Spring提供了一个javax。servlet。在servlet环境中工作时可以使用的过滤器实现(问题并没有这么说)。这将确保您的Hibernate会话在请求期间保持打开状态,而不仅仅是针对单个事务

这个类上的Javadoc非常全面,可能是一个很好的起点。

阎建华
2023-03-14

是的,Hibernate的会话可以开始并提交多个事务。您需要做的是将打开的会话存储在某个地方,然后重用它。请注意,该会话不是线程安全对象,但如果您确定它不会出现并发问题,则只需使用TransactionSynchronizationUtils将会话绑定到线程资源,然后在需要时解除绑定即可,您可以在这里找到一个示例,也可以查看OSIV及其标准实现。

这是一件非常复杂的事情,您需要立即关闭会话,不要重复使用它,因为它可能会带来麻烦:

  • 缓存中的对象不会自动退出,因此会话的大小将不断增大,直到内存耗尽
 类似资料:
  • 我对Hibernate中的会话和事务的概念有点困惑。据我所知,Hibernate使用会话(持久性上下文),它基本上是需要持久,删除或数据库中任何内容的实体的缓存。会话封装事务,因此我启动一个会话,然后创建一个事务。事务关闭后,持久性上下文中的所有内容都将刷新到数据库,如果我关闭会话,也会发生同样的事情。 为什么我需要两者?我可以在不创建交易的情况下做同样的事情吗?

  • 我指的是https://developer.jboss.org/wiki/SessionsAndTransactions,目前正试图了解与JTA的划界问题。它声明在使用getCurrentSession()的特定事务中,总是给出相同的当前会话。是不是意味着: < li >如果另一个用户在另一个线程中执行同一段代码(通过查找获取一个事务,然后使用getCurrentSession()并关闭该事务),

  • 我有一个问题,如果我的服务上有一个客户端调用两个方法,它就会失败,因为第二个方法中的事务没有与之关联的会话。但是,如果我将这两种方法组合到服务中,并从客户机代码中调用其中一种方法,它就会成功。 谁能给我解释一下为什么会这样? 考虑下面的代码: 所以这里发生的事情是,在我的客户机代码中(它不知道事务),如果我调用#getChildrenFor(id),我就没事了。但如果我打电话: 然后hiberna

  • 问题内容: 我正在使用Spring和Hibernate,Spring的配置如下。如何配置两个数据源, session factories。使用注释管理事务。请指教 问题答案: 在Hibernate DAO中,我们可以使用@Qualifier注释,如下所示连接2个会话工厂

  • 我想使用Spring MVC 和Hibernate。我不想在所有控制器方法上使用服务层或属性(或者,更确切地说,我希望Spring将它们全部视为事务性)。因此,我想在控制器方法开始使用数据库时启动事务,并在控制器方法返回 ViewAndModel 或回滚事务(如果发生任何错误)时提交事务。此外,我希望视图支持延迟Hibernate加载,例如,如果html模板请求,请在自动提交模式下选择数据。 我知