Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate查询和会话缓存混淆_Java_Hibernate - Fatal编程技术网

Java Hibernate查询和会话缓存混淆

Java Hibernate查询和会话缓存混淆,java,hibernate,Java,Hibernate,我正在批量数据库导出应用程序中使用Hibernate。在阅读了许多关于会话缓存的问题/答案和文章后,我仍然不理解以下内容: 假设每个HQL加载实体列表以对其进行迭代并读取引用对象/集合的值。在这种情况下,是否将引用的对象/集合保存在会话缓存中?是 执行HQL查询时,必须在当前会话中加载所有返回的实体。这是因为实体处于连接状态,因此任何修改都可以通过“脏检查机制”检测到 如果要插入大量实体,最好在每批之后插入,以便从当前第一级删除当前条目,因为下一批中无论如何都不需要它们 如果要检索适合当前RAM

我正在批量数据库导出应用程序中使用Hibernate。在阅读了许多关于会话缓存的问题/答案和文章后,我仍然不理解以下内容:

假设每个HQL加载实体列表以对其进行迭代并读取引用对象/集合的值。在这种情况下,是否将引用的对象/集合保存在会话缓存中?

执行HQL查询时,必须在当前会话中加载所有返回的实体。这是因为实体处于连接状态,因此任何修改都可以通过“脏检查机制”检测到

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


如果要检索适合当前RAM的大型实体集合,并且希望在对给定实体进行操作的整个过程中都附加这些实体,则在批处理结束时,您将刷新并逐出()当前处理的实体。这一次您没有清除(),因为您仍然希望连接未处理的实体,以便Hibernate可以将更改传播到数据库。

谢谢您的回答。但是,在每一篇关于Hibernate缓存的文章中,都会提到未缓存的查询结果,除非激活了二级缓存?这是您的一条很好的评论。缓存有三种类型:第一级(面向会话)、第二级(由所有会话共享)、查询缓存(存储查询返回的实体ID,因为实际实体无论如何都应该在第二级缓存中)。因此,除非激活二级缓存和查询缓存,否则在事务结束和会话关闭后不会缓存查询结果。请看以下文章:,特别是以下句子:“使用上面的代码,我们希望查询只执行一次。但是,如果我们查看这个事务的PurePath,我们可以看到已经执行了两个数据库查询。“会话缓存在使用session.find()或session.load()时启动,而不是在按id执行查询时启动。Hibernate不会将这些查询转换为get()/load(),但只需创建查询并执行它。如果结果已缓存,它将返回先前缓存的条目,因此即使执行了两个查询,只要在同一会话中执行它们,您仍将获得相同的对象引用。