Java 在hibernate批量更新后清除会话、刷新、刷新?

Java 在hibernate批量更新后清除会话、刷新、刷新?,java,hibernate,jakarta-ee,jpa,orm,Java,Hibernate,Jakarta Ee,Jpa,Orm,正如我们所知,当使用hibernate(甚至在HQL中)对DB进行批量更新时,所做的更改不会复制到存储在当前会话中的实体 因此,我可以调用session.refresh来加载对会话实体的修改 我们经常调用flush将修改发送到数据库,但是文档中说它“同步”了会话和数据库 这是否意味着flush将能够为我的会话实体设置良好的新db值?或者flush最终会用实体中存储的旧db值擦除我的新db值? (顺便说一句,如果hibernate的行为是第一个,它如何检测哪一个是“好值”?) 如果我不能在这种情况

正如我们所知,当使用hibernate(甚至在HQL中)对DB进行批量更新时,所做的更改不会复制到存储在当前会话中的实体

因此,我可以调用session.refresh来加载对会话实体的修改

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

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


如果我不能在这种情况下使用flush,那么最好在每次批量更新之后清除会话,这样我们就可以确保会话中有好的值了。

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

“正如我们所知,当使用hibernate(甚至在HQL中)对DB进行批量更新时,所做的更改不会复制到当前会话中存储的实体。”我不太明白您在这里的意思。您是否在一个
会话中更新数据库,并希望将更新反映在另一个
会话的一级缓存中的对象中?否,我正在执行“update xxxEntity set yyy=zzz”请求,执行此操作时,会话缓存中已经存在的xxxEntity对象尚未设置yyy=zzz值,除非您调用这些实体上的session.refresh.I C。这是一个猜测,但我不认为
flush
会在批量更新时过度写入您对DB所做的更改。当Hibernate加载一个实体时,它会创建两个对象——一个是自己保存的,另一个是交给您的。当
会话
处于
刷新
状态时,Hibernate会比较它拥有的副本(即“原件”)的状态和它提供给您的副本的状态;它根据差异(如果有的话)发布SQL。我过度简化了它,但这基本上就是我的心智模型。所以我猜Hibernate不会为您的实体发出任何SQL,因为它检测不到任何更改。在更新之前刷新和清除对我来说很好,最好在更新之后刷新和清除,以避免我的批量更新被未刷新的实体擦除。。。