【问题标题】:after session1.close(), session2 getting objects from cache in hibernate在 session1.close() 之后,session2 在休眠中从缓存中获取对象
【发布时间】:2026-01-18 02:00:01
【问题描述】:

听说在 session.close() 之后,本次会话中的对象将从缓存中删除。

如果“是” 那么为什么 'session2' 对象从缓存中检索对象?

当我第一次获取数据(查询执行)时,我正在关闭“session1”,数据将存储在缓存中(默认一级缓存),对! 但是,在创建 'session2' 对象之后,我仍然能够检索特定对象(没有执行查询),这意味着它正在从缓存中获取对象! ....为什么?

在图片中,我已经粘贴了我的代码 Image : my java files, table, persistent class, output

【问题讨论】:

  • 您是如何得出结论的,即它与您在上一个会话中获取的对象相同????
  • 因为没有为我的第二个会话的对象(对象 o = session2.load(Pojo_class.class,1))执行查询...这就是为什么我认为它是从我拥有的同一个对象中检索的从第一个会话的对象中检索(Criteria c = session1.createCriteria(Pojo_class.class); c.add(Restrictions.eq("id",1); 关于 session2 的同一个对象我错了吗?
  • 检查您正在检索的对象的引用是否相同。它与规范不同。你也可以分享你创建的休眠配置。二级缓存或查询缓存是否开启???
  • 没有。我的配置文件中没有启用任何缓存!.......

标签: java hibernate caching


【解决方案1】:

您需要了解 Hibernate 中的缓存级别。

一级缓存:

一级缓存为Session缓存,为强制缓存 所有请求都必须通过它。 Session 对象保持一个 在将对象提交到数据库之前,先将其置于自己的权力之下。

二级缓存:

二级缓存是可选缓存,一级缓存将 在尝试定位对象之前,请务必咨询 二级缓存。二级缓存可以配置在 per-class 和 per-collection 基础,主要负责缓存 跨会话的对象。

查询级缓存:

Hibernate 还为查询结果集实现了缓存,它集成了 与二级缓存密切相关。

这里引用了Cache Hibernate Tutorial。所以简而言之,该会话的第一级缓存被删除。但这并不意味着其他的 Session Cache 或者二级缓存需要被移除,因为有他自己的 Cache。希望对你有所帮助。

【讨论】: