我使用hibernate作为我的ORM解决方案,使用EHCache作为二级(读写)缓存。
我的问题是:是否可以直接访问二级缓存?
我想访问此内容:http://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/ReadWriteCache.html
如何访问Hibernate正在使用的相同ReadWriteCache?
我正在进行一些直接/自定义JDBC插入,我希望自己将这些对象添加到二级缓存中。
答案 0 :(得分:6)
我会在映射到您实体的EntityPersister上调用“afterInsert”,因为Read / Write是一种异步并发策略。在查看Hibernate 3.3源代码后,我将它拼凑在一起。我不是百分之百,这会起作用,但对我来说看起来不错。
EntityPersister persister = ((SessionFactoryImpl) session.getSessionFactory()).getEntityPersister("theNameOfYourEntity");
if (persister.hasCache() &&
!persister.isCacheInvalidationRequired() &&
session.getCacheMode().isPutEnabled()) {
CacheKey ck = new CacheKey(
theEntityToBeCached.getId(),
persister.getIdentifierType(),
persister.getRootEntityName(),
session.getEntityMode(),
session.getFactory()
);
persister.getCacheAccessStrategy().afterInsert(ck, theEntityToBeCached, null);
}
-
/**
* Called after an item has been inserted (after the transaction completes),
* instead of calling release().
* This method is used by "asynchronous" concurrency strategies.
*
* @param key The item key
* @param value The item
* @param version The item's version value
* @return Were the contents of the cache actual changed by this operation?
* @throws CacheException Propogated from underlying {@link org.hibernate.cache.Region}
*/
public boolean afterInsert(Object key, Object value, Object version) throws CacheException;
答案 1 :(得分:1)
我是通过创建自己的缓存提供程序来完成的。我只是覆盖EhCacheProvider并使用我自己的变量作为管理器,所以我可以在静态中返回它。获得CacheManager后,可以调用manager.getCache(class_name)来获取该实体类型的Cache。然后使用主键,类型和类名构建CacheKey:
CacheKey cacheKey = new CacheKey(key, type, class_name, EntityMode.POJO,
(SessionFactoryImplementor)session.getSessionFactory());
缓存本质上是一个映射,因此您可以检查对象是否在缓存中,或者遍历实体。
最初构建SessionFactory时可能有一种方法可以访问CacheProvider,这样就无需实现自己的。
答案 2 :(得分:1)
hibernate和JPA现在都提供对底层二级缓存的直接访问:
sessionFactory.getCache();
entityManager.getCache();
答案 3 :(得分:0)