Spring Boot应用中如何查看Hibernate一级缓存(Session)中的内容?
查看Hibernate一级缓存(Session)中对象的调试方法
要在user.setAge(23L);行设置断点(已执行第一次save)后查看Session缓存里的user值,有几种直接的调试办法:
方法一:用Hibernate Session API手动查询
在IDE的表达式求值窗口(比如IDEA的Evaluate Expression)里执行这段代码:
// 获取当前Hibernate Session org.hibernate.Session session = ((org.hibernate.Session) userRepository.getEntityManager().getDelegate()); // 直接取出缓存中的user实例 session.get(User.class, user.getId()); // 或者查看Session缓存的统计信息 session.getSessionFactory().getStatistics().getEntityStatistics(User.class.getName());
执行后就能看到缓存里的user属性值——第一次save后user已经有了ID,而且缓存里的实例和你代码里的user是同一个引用。
方法二:直接查看Session内部结构
- 调试时从
userRepository里找到entityManager实例; - 展开
entityManager,找到delegate字段,这就是Hibernate的SessionImpl对象; - 继续展开
SessionImpl→persistenceContext→entityEntries,这个Map里存着当前Session缓存的所有实体,找到对应的User就能查看它的属性。
方法三:启用Hibernate统计日志辅助验证
要是需要更直观的缓存状态输出,在application.properties里添加配置:
spring.jpa.properties.hibernate.generate_statistics=true logging.level.org.hibernate.stat=DEBUG
调试时控制台会输出Session缓存的统计数据,包括实体数量、加载情况等,配合断点能辅助确认缓存内容。
补充:第一次
save(user)执行后,Hibernate已经把user实例放进Session缓存了,此时你代码里的user引用和缓存里的实例是同一个,所以直接看代码里的user对象属性,其实和缓存内容是一致的。只有通过其他查询获取的实例,才需要专门查Session缓存。
内容的提问来源于stack exchange,提问作者Hassen Gaaya
相关产品推荐
相关产品推荐

