2

当hibernate关闭一个会话时,关闭的目的基本上是关闭底层连接和清理一级缓存。为什么刷新也不会在这里自动发生?

4

1 回答 1

7

事务的角度来看,刷新与关闭会话非常不同,flush应该发生在事务的边界内(或commit时间):

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

  • 刷新会话
  • 提交事务
  • 关闭会话
  • 处理异常

另一方面,关闭会话(和底层连接)应该在事务结束后完成(关闭连接时待处理事务的行为 未定义)。

因此,没有理由在关闭时做任何事情并促进不良语义,并且具有不同的操作是完全合理的。

总结一下:

  1. 只需按照您的预期使用事务和适当的分界(如果需要,会话将在提交时刷新,具体取决于 FlushMode)。
  2. 使用SessionFactory#getCurrentSession(),你不必Session#close()自己(Session提交时会为你关闭)。
于 2009-12-28T12:23:09.297 回答