2014-05-15 66 views
0

我在批量数据库导出应用程序中使用Hibernate。Hibernate查询和会话缓存混淆

假设实体名单每HQL加载遍历并读取引用的对象/集合值:读了很多问题/答案和文章有关会话缓存我还是不明白以下后。在这种情况下会在Session Cache中保存被引用的对象/集合吗?

回答

0

是它。

当你执行一个HQL查询返回的所有实体必须在本届会议上加载。这是因为实体处于ATTACHED状态,所以任何修改都可以通过“脏检查机制”检测到。

如果要插入大量实体,最好在每个批次之后输入flush() and clear(),以便从当前第一级删除当前条目,因为您无论如何都不需要它们在下一批中。

如果您正在检索一个适合您当前RAM的大型实体集合,并且希望实体在整个时间内都被连接到一个给定实体上,那么在批处理结束时,您将刷新并驱逐( )当前处理的实体。这次你不清除(),因为你仍然想保留附加的未处理的实体,这样Hibernate可以将更改传播到数据库。

+0

谢谢你的回答。但是在每篇关于Hibernate缓存的文章中,都有一个关于NOT CACHED查询结果的讨论,除非第二级缓存被激活? – user3639982

+0

这是你的很棒的评论。有三种类型的缓存:第一级(面向会话),第二级(由所有会话共享),查询缓存(存储由查询返回的实体ID,因为实际实体应该在第二级缓存中)。因此,在事务结束并且会话关闭后,查询结果不会被缓存,除非激活第二级缓存和查询缓存。 –

+0

请看下面的文章:http://apmblog.compuware.com/2009/02/16/understanding-caching-in-hibernate-part-one-the-session-cache/,尤其是下面的句子:“Using上面的代码我们希望查询只执行一次,但是如果我们看一下这个事务的PurePath,我们可以看到,两个数据库查询已经被执行了。“ – user3639982