Управление Hibernate 2-го уровня кэша - PullRequest
5 голосов
/ 31 марта 2009

Я использую hibernate в качестве своего решения ORM с EHCache в качестве кэша второго уровня (чтение-запись).

Мой вопрос таков: возможен ли прямой доступ к кэшу второго уровня?

Я хочу получить доступ к этому: http://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/ReadWriteCache.html

Как я могу получить доступ к тому же ReadWriteCache, который используется Hibernate?

У меня есть несколько прямых / пользовательских вставок JDBC, которые я делаю, и я хочу сам добавить эти объекты в кэш 2-го уровня.

Ответы [ 4 ]

6 голосов
/ 01 апреля 2009

Я бы назвал afterInsert для EntityPersister, который отображается на вашу сущность, так как Read / Write является стратегией асинхронного параллелизма. Я собрал это воедино после просмотра источника Hibernate 3.3. Я не на 100% уверен, что это сработает, но мне это нравится.

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 голос
/ 15 мая 2012

И hibernate, и JPA теперь предоставляют прямой доступ к базовому кешу 2-го уровня:

sessionFactory.getCache();
entityManager.getCache();
1 голос
/ 01 апреля 2009

Я сделал это, создав свой собственный поставщик кеша. Я просто переопределил EhCacheProvider и использовал свою собственную переменную для менеджера, чтобы я мог вернуть ее в статическом виде. Как только вы получите CacheManager, вы можете вызвать manager.getCache (class_name), чтобы получить Cache для этого типа сущности. Затем вы создаете CacheKey, используя первичный ключ, тип и имя класса:

  CacheKey cacheKey = new CacheKey(key, type, class_name, EntityMode.POJO,
    (SessionFactoryImplementor)session.getSessionFactory());

Кэш - это, по сути, карта, поэтому вы можете проверить, находится ли ваш объект в кэше, или просмотреть объекты.

Возможно, существует способ доступа к CacheProvider при первоначальной сборке SessionFactory, который позволит избежать необходимости реализации собственного.

0 голосов
/ 31 марта 2009
...