【发布时间】: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 加载一个实体时,它会创建两个对象 - 一个保留给自己,一个分发给您。当session是flushed 时,Hibernate 会比较它的副本(即“原始”)的状态和它给你的副本的状态;它会根据差异(如果有)发出 SQL。我把它过度简化了,但这本质上是我的心智模型。所以我的猜测是 Hibernate 不会为你的实体发出任何 SQL,因为它没有检测到任何变化。
标签: java hibernate jakarta-ee jpa orm