操作Hibernate二级缓存

时间:2009-03-31 17:36:38

标签: java hibernate caching java-ee ehcache

我使用hibernate作为我的ORM解决方案,使用EHCache作为二级(读写)缓存。

我的问题是:是否可以直接访问二级缓存?

我想访问此内容:http://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/ReadWriteCache.html

如何访问Hibernate正在使用的相同ReadWriteCache?

我正在进行一些直接/自定义JDBC插入,我希望自己将这些对象添加到二级缓存中。

4 个答案:

答案 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)