【问题标题】:Why hibernate session.close() does not flushes the data automatically?为什么休眠 session.close() 不会自动刷新数据?
【发布时间】:2009-12-28 11:48:46
【问题描述】:

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

【问题讨论】:

    标签: hibernate session orm flush


    【解决方案1】:

    transactional的角度来看,flushing与关闭会话有很大不同,flush应该发生在事务的边界内(或commit时间):

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

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

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

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

    总结一下:

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

    【讨论】:

    • @Pascal,我认为您并没有真正回答操作员的问题。他没有建议刷新和关闭会话是相同的,而是如果会话是脏的,那么在关闭它时也应该调用刷新。如果有人使用 FlushMode.Auto 并且他们更新了一个持久对象,那么这对我来说确实有意义,那么我认为 Hibernate 应该在它认为它已经完成的时候处理刷新对象,Hibernate 不应该忽略这个变化。如果不调用flush,我认为可能会发生这种情况。
    • @Ittai 我已经澄清了我的答案(还不够清楚),我试图解释为什么我不同意你的观点。
    • @Ittai 不能将 SQL 语句发送到数据库事务之外的数据库。
    • @Ittai 我会回答另一个问题。
    • @Ittai 不,我的意思是任何 SQL 语句,包括 SELECT。我建议阅读Non-transactional data access and the auto-commit mode
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多