为什么 hibernate session.close() 不会自动刷新数据?

发布于 2024-08-16 22:12:53 字数 65 浏览 10 评论 0原文

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

When hibernate closes a session, the purpose of close is basically to close the underlying connection and the clean up the first level cache. Why the flush also does not happens automatically here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

空城之時有危險 2024-08-23 22:12:53

事务点来看看来,刷新非常与关闭会话不同,刷新应该发生在事务的边界内(或在提交时):

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

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

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

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

总结一下:

  1. 只需按照您的预期使用事务和适当的划分(如果需要,会话将在提交时刷新,具体取决于 FlushMode)。
  2. 使用 SessionFactory#getCurrentSession() 并且您不必自己 Session#close()Session 将在提交时为您关闭时间)。

From a transactional point of view, flushing is very different from closing the session and flush should occur inside the boundaries of a transaction (or at commit time):

Ending a Session usually involves four
distinct phases:

  • flush the session
  • commit the transaction
  • close the session
  • handle exceptions

On the other hand, closing a Session (and the underlying connection) should be done after a transaction has ended (the behavior of a pending transaction when closing a connection is undefined).

There is thus no reason to do anything on close and to promote bad semantics and it makes perfect sense to have distinct operations.

To sum up:

  1. just use a transaction and proper demarcation as you're supposed to (and the session will get flushed at commit time if required, depending on the FlushMode).
  2. use SessionFactory#getCurrentSession() and you won't have to Session#close() yourself (the Session will get closed for you at commit time).
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文