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