在休眠事务中,我要更新一行(通过session.update(domainObject)
,然后使用同一表上的where条件以及其他表上的联接来执行select count(*)
。我观察到的(通过日志)是更新操作发生在事务结束时,因此应该在更新查询显示错误结果之后执行的选择查询。我不明白为什么会这样。有线索吗?
答案 0 :(得分:1)
执行SELECT
时,持久性提供程序确定是否应刷新先前在同一事务中执行的先前CRUD操作。
这是为了确保返回的结果正确。
从理论上讲,当您进行包含对当前会话中已修改实体的引用的SELECT时,应该发生刷新。
您可能想尝试:
a)将刷新模式设置为:<property name="org.hibernate.flushMode" value="AUTO"/>
。
这应该是默认设置,但是您可能会覆盖它。这是为了确保:
有时,在执行查询之前会刷新会话,以便 确保查询永远不会返回陈旧状态。
b)将刷新模式设置为:<property name="org.hibernate.flushMode" value="ALWAYS"/>
。
请谨慎对待,因为:
在每次查询前都会刷新会话。
c)(在最后一个查询之前)做一本手册session.flush()