如果使用的是ehcacheprovider,则需要访问cachemanager成员变量。不幸的是,它是私有的,没有公共访问方法,所以我最终创建了自己的ehcacheprovider副本,该副本使用带有公共静态方法的静态for cachemanager返回它。我假设您可以以相同的方式处理其他缓存提供程序,或者只实现缓存提供程序接口。
一旦拥有了cachemanager,就可以使用cachemanager.get cache(类名)获取域(类)名称的缓存。它返回一个缓存,您可以使用cache.getkeys()迭代该缓存。每个键都是一个cache key,上面有实体ID,因此您可以使用cache.get(key)返回实际实体。
如果您不介意绕过一些Java安全性,并且依赖于特定的Hibernate实现,那么另一个选项是:(异常处理省略):
EhCacheProvider cp = (EhCacheProvider)((SessionFactoryImpl)session.getSessionFactory()).getSettings().getCacheProvider()
Field f = EhCacheProvider.class.getDeclaredField("manager");
f.setAccessible(true);
CacheManager cm = (CacheManager)f.get(cp);
Cache c = cm.get(Entity.class);