我正在使用 hibernate 和 jsp/servlet 编写一个基于 Web 的应用程序。我读过有关sessionFactory.getCurrentSession
and sessionFactory.openSession
方法。我知道它们之间的基本区别(使用getCurrentSession
您不必关闭连接,当您提交事务时,您的会话将自动关闭)。根据我的理解,我们应该选择getCurrentSession
并通过每个请求的会话来完成。
让我们考虑以下场景:
- 方法A调用
getCurrentSession
并获取当前会话
- 在方法 A 中,使用步骤 1 中的会话启动事务
- 方法A调用方法B,方法B也有
getCurrentSession
并开始交易
- 方法 B 提交其事务
- 控制返回到方法 A 并且它还提交事务
现在我的问题是
- 步骤 1 和步骤 3 中找到的会话是否是同一个会话?
- 如果问题 1 的答案是肯定的,那么它将如何处理步骤 4 中的提交?理想情况下,它应该自行关闭会话,并在第 5 步抛出异常。
- 如果问题1的答案是否定的,那么您如何处理这种情况?
步骤 1 和步骤 3 中找到的会话是否是同一个会话?
它们应该是相同的,这在某种程度上是合同的一部分getCurrentSession()
你会得到Session
只要工作单元尚未完成(即事务已提交或回滚),就绑定到线程。Java 与 Hibernate 的持久性是这样说的(第 481 页):
所有调用的数据访问代码getCurrentSession()
关于全球共享SessionFactory
获得相同的电流Session
— 如果它被调用在
同一个线程。工作单元完成时Transaction
已提交(或回滚)。 Hibernate 还会刷新并关闭当前的Session
及其持久化上下文(如果您提交或回滚事务)。这里的含义是调用getCurrentSession()
提交或回滚后产生新的Session
和一个新的持久性上下文。
您可能还想阅读 javadoc 的内容Session#beginTransaction() http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html#beginTransaction() says.
如果问题 1 的答案是肯定的,那么它将如何处理步骤 4 中的提交。理想情况下,它应该自行关闭会话,并在步骤 5 中给出错误。
第4步应该没有问题,Session
将被冲洗,Transaction
将致力于并Session
关闭。但我预计第 5 步会失败TransactionException http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/TransactionException.html(这是我的赌注)。但让我引用javadocTransaction http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Transaction.html:
事务与会话相关联,通常通过调用来实例化Session.beginTransaction()
。单个会话可能跨越多个事务,因为会话的概念(应用程序和数据存储之间的对话)的粒度比事务的概念更粗。然而,任何时候最多有一个未提交的事务与特定会话相关.
正如上面所强调的,我们正在讨论一些不应该发生的事情(即设计问题)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)