2009-03-31 7 views
5

Ich verwende Hibernate als meine ORM-Lösung, mit EHCache als Second-Level (Read-Write) -Cache.Manipulieren des Ruhezustands 2nd Level Cache

Meine Frage ist: Ist es möglich, direkt auf den Second Level Cache zuzugreifen?

Ich möchte diese zuzugreifen: http://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/ReadWriteCache.html

Wie kann ich die gleiche ReadWriteCache zugreifen, die von Hibernate verwendet wird?

Ich habe einige direkte/benutzerdefinierte JDBC-Einfügungen, die ich mache, und ich möchte diese Objekte selbst in den Cache der zweiten Ebene hinzufügen.

Antwort

6

Ich würde auf dem EntityPersister "Afterinsert" nennen, die zu Ihrem Unternehmen abbildet, da Read/Write eine asynchrone Concurrency Strategie. Ich habe das nach einem Blick durch die Hibernate 3.3-Quelle zusammengesetzt. Ich bin nicht 100%, dass das funktioniert, aber es sieht gut aus.

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

Ich tat dies von meinem eigenen Cache-Provider zu schaffen. Ich habe einfach EhCacheProvider übersteuert und meine eigene Variable für den Manager verwendet, so dass ich es in einer statischen zurückgeben konnte. Sobald Sie den CacheManager abgerufen haben, können Sie manager.getCache (Klassenname) aufrufen, um einen Cache für diesen Entitätstyp abzurufen. Dann bauen Sie eine CacheKey den Primärschlüssel verwenden, den Typ und den Klassennamen:

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

Der Cache ist im Wesentlichen eine Karte, so dass Sie überprüfen können, ob Ihr Objekt im Cache vorhanden ist, oder die Einheiten durchlaufen .

Es gibt möglicherweise eine Möglichkeit, auf den CacheProvider zuzugreifen, wenn Sie die SessionFactory zu Beginn erstellen, wodurch die Notwendigkeit zur Implementierung Ihrer eigenen vermieden wird.

0

Sowohl Hibernate und JPA nun direkten Zugriff auf die darunter liegende zweite Level-Cache bieten:

sessionFactory.getCache(); 
entityManager.getCache(); 
Verwandte Themen