如何操作Hibernate配置中定义的缓存

Hibernate通过配置项 hibernate.cache.provider_class 来指定所采用的Cache API,但是在Hibernate所提供对缓存操作方法都是一些高层的API,也就是说Hibernate提供对缓存的操作方法都是基于对象的操作,例如

session.evict(Object obj);
SessionFactory.evictXxxx

但有时候这些方法并不能完成我们想要的功能时,因此我们需要直接操控缓存来达到我们想要的目的。

挨个打开Hibernate的源代码发现了有一个类Settings,这个类有一个getCacheProvider方法,而通过SessionFactoryImpl类可以获取Settings的实例。从字面上来可以猜出SessionFactoryImpl就是对接口SessionFactory的实现,而getCacheProvider就是用来获取缓存管理器的实例,经过一番试验证实了以上猜测。

接下来可以在Hibernate的初始化时做点手脚来获取CacheProvider实例:

Configuration cfg = new Configuration().configure(cfg_path);
//将buildSessionFactory返回的对象强制转为SessionFactoryImpl类型
SessionFactoryImpl sessionFactory = (SessionFactoryImpl)cfg.buildSessionFactory();
this.cacheProvider = sessionFactory.getSettings().getCacheProvider();

这样我们就拿到了CacheProvider实例,接下来再看看CacheProvider接口,该接口是通过buildCache(String name, Properties props)方法来创建缓存的
也就是说我们还需要一个参数就是props,这个参数就是Hibernate的配置信息,再次阅读SessionFactoryImpl源码便可知道通过Configuration类来获取配置信息

所以最终完整的代码是:

Configuration cfg = new Configuration().configure(cfg_path);
SessionFactoryImpl ssnFactory = (SessionFactoryImpl)cfg.buildSessionFactory();
CacheProvider cacheProvider = ssnFactory.getSettings().getCacheProvider();
Cache cache = cacheProvider.buildCache("cache_name", cfg.getProperties());
cache.get(xxxxx);
cache.set(xxxx,xxxx);

你可能感兴趣的:(Hibernate,cache,配置管理)