【问题标题】:Clearing session, flushing, refreshing, after hibernate bulk updates?休眠批量更新后清除会话,刷新,刷新?
【发布时间】:2011-12-07 02:52:32
【问题描述】:

我们知道,当使用 hibernate 对数据库进行批量更新时(即使在 HQL 中),所做的更改不会复制到当前会话中存储的实体。

所以我可以调用 session.refresh 来加载对我的会话实体的修改。

我们经常调用flush来将我们的修改发送到数据库,但文档说它“同步”会话和数据库......

这是否意味着刷新将能够为我的会话实体设置好的新 db 值?还是刷新最终会用存储在实体中的旧值擦除我的新数据库值? (顺便说一句,如果 hibernate 的行为是第一个,它如何检测哪一个是“好值”?)。

如果我不能在这种情况下使用刷新,最好在每次批量更新后清除会话,以确保我们的会话中有良好的值?

【问题讨论】:

  • “我们知道,当使用休眠对数据库进行批量更新时(即使在 HQL 中),所做的更改不会复制到当前会话中存储的实体。”我不太明白你在这里的意思。您是否正在更新一个 Session 中的数据库,并希望将更新反映在另一个 Session 的一级缓存中的对象中?
  • 不,我正在执行“更新 xxxEntity set yyy=zzz”请求,并且在执行此操作时,会话缓存中的 xxxEntity 对象尚未设置 yyy=zzz 值,除非您调用这些实体上的 session.refresh。
  • I C. 这是一个猜测,但我认为 flush 不会用批量更新覆盖您对数据库所做的更改。当 Hibernate 加载一个实体时,它会创建两个对象 - 一个保留给自己,一个分发给您。当sessionflushed 时,Hibernate 会比较它的副本(即“原始”)的状态和它给你的副本的状态;它会根据差异(如果有)发出 SQL。我把它过度简化了,但这本质上是我的心智模型。所以我的猜测是 Hibernate 不会为你的实体发出任何 SQL,因为它没有检测到任何变化。

标签: java hibernate jakarta-ee jpa orm


【解决方案1】:

flush 所做的只是将之前缓存的 SQL 语句发送到数据库。它不会更改已经在会话中的对象。在某种程度上,它与您需要的相反。来自 flush 的 SQL 语句可能会覆盖您的批量更新更改。您可能想要做的是flush(),然后是clear(),然后再进行更新。或者,如果您不想清除整个缓存,evict()。我从未尝试过refresh(),但它似乎也可以。

【讨论】:

  • 在更新前刷新和清除对我来说似乎很好,最好在之后刷新和清除以避免我的批量更新被未刷新的实体擦除......
猜你喜欢
  • 2012-07-04
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多