2009-12-28 61 views

回答

7

transactional角度来看,flushing是从关闭会话和flush一个事务的边界内应发生(或在commit时间)非常不同:

结束会话通常涉及四个 不同阶段:

  • 冲洗会议
  • 提交事务
  • 关闭会话
  • 处理异常

在另一方面,关闭会话(与基础连接)应在交易结束后进行(未决交易的行为,关闭连接时是undefined)。

因此没有理由关闭任何东西并促进不良语义,并且具有不同的操作是非常有意义的。

综上所述:

  1. 只是使用事务和适当的划分为你应该(和会议将在必要时提交时就脸红,这取决于FlushMode)。
  2. 使用SessionFactory#getCurrentSession()并且您不必自己Session#close()Session将在提交时关闭)。
+0

@Pascal,我想你并没有真正回答op的问题。他没有建议刷新和关闭会话是相同的,但是如果会话很脏,那么在关闭它时也应该调用flush。如果有人使用FlushMode.Auto并且他们更新了一个持久对象,那么我认为Hibernate应该在它认为已经完成的时候冲洗该对象,Hibernate不应该忽略这个变化。如果不调用flush,我认为可能会发生这种情况。 – Ittai 2010-10-14 07:44:44

+1

@Ittai我已经澄清了我的答案(不够清楚),我试图解释为什么我不同意你的看法。 – 2010-10-14 08:26:46

+0

@帕斯卡,谢谢你的澄清,但我仍然不同意。关于Item2,在我的案例中,这与我使用session-per-request模式无关,有时我需要会话在提交后保持打开状态。关于Item1,这正是我不喜欢的 - 为什么要使用交易进行单个更新?我将交易视为一种确保几个不同命令一致的方式(将他们分组为一个工作单元)。但是当只有一个命令时,我们为什么要使用一个事务? (顺便说一句,我以前总是使用JDBC,这可能会影响我的特征)。 – Ittai 2010-10-14 08:36:02

相关问题