众所周知,在使用hibernate模式(甚至在HQL中)对数据库进行批量更新时,所做的更改不会复制到当前会话中存储的实体中。
因此,我可以调用session.refresh将修改内容加载到我的会话实体中。
我们经常调用flush将修改发送到数据库,但是文档说它“同步”了会话和数据库。
这是否意味着flush能够为我的会话实体设置良好的新db值?否则flush最终将使用存储在实体中的旧数据库擦除我的新db值?(顺便说一句,如果hibernate的行为是第一个,那么它如何检测到哪个是“好值”?)
如果我不能在这种情况下使用冲洗,那么最好在每次批量更新后清除会话,以确保我们在会话中具有良好的价值?
所有flush要做的就是将以前缓存的SQL语句发送到数据库。它不会更改已在会话中的对象。在某种程度上,它的作用与您的需求相反。刷新产生的SQL语句可能会覆盖您的批量更新更改。你可能想要做的flush(),然后clear()你的更新之前。或者,如果您不想清除整个缓存,则evict()。我从未尝试过,refresh()但似乎也可以。
flush
flush()
clear()
evict()
refresh()