在休眠批量更新后,清除会话,刷新,刷新?

时间:2011-10-13 16:25:17

标签: java hibernate java-ee jpa orm

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

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

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

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

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

1 个答案:

答案 0 :(得分:8)

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

相关问题