2009-03-31 12 views
5

मैं अपने ओआरएम समाधान के रूप में हाइबरनेट का उपयोग कर रहा हूं, ईएचसीएच के साथ दूसरे स्तर (रीड-राइट) कैश के रूप में।हाइबरनेट द्वितीय स्तर कैश को मैनिपुलेट करना

मेरा प्रश्न है: क्या दूसरे स्तर के कैश को सीधे एक्सेस करना संभव है?

मैं इस का उपयोग करना चाहते हैं: http://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/ReadWriteCache.html

मैं एक ही ReadWriteCache जाता है कि हाइबरनेट द्वारा किया जा रहा कैसे उपयोग कर सकते हैं?

मेरे पास कुछ प्रत्यक्ष/कस्टम जेडीबीसी आवेषण हैं जो मैं कर रहा हूं, और मैं उन वस्तुओं को दूसरे स्तर के कैश में जोड़ना चाहता हूं।

उत्तर

6

मैं EntityPersister कि आपकी संस्था के लिए नक्शे के बाद से पढ़ें/लिखें एक अतुल्यकालिक संगामिति नीति है "afterInsert" कहेंगे। मैंने हाइबरनेट 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

मैं अपने खुद के कैश प्रदाता बनाने के द्वारा ऐसा किया। मैं सिर्फ एह कैशप्रोवाइडर को ओवरराइड करता हूं और मैनेजर के लिए अपना खुद का चर इस्तेमाल करता हूं, इसलिए मैं इसे स्थिर में वापस कर सकता हूं। एक बार जब आप CacheManager प्राप्त कर लेंगे, तो आप उस इकाई प्रकार के लिए कैश प्राप्त करने के लिए manager.getCache (class_name) को कॉल कर सकते हैं। तो फिर तुम प्राथमिक कुंजी, प्रकार, और वर्ग के नाम का उपयोग कर एक CacheKey निर्माण:

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

कैश है अनिवार्य रूप से तो तुम अगर आपके वस्तु कैश में है देखते हैं, या संस्थाओं के माध्यम से पुनरावृति करने के लिए जाँच कर सकते हैं एक नक्शा ।

जब आप सत्र फ़ैक्टरी का निर्माण करते हैं तो कैशप्रोवाइडर तक पहुंचने का कोई तरीका हो सकता है जो आपके स्वयं को लागू करने की आवश्यकता से बच जाएगा।

0

दोनों हाइबरनेट और जेपीए अब अंतर्निहित 2 स्तर कैश के लिए सीधी पहुँच प्रदान करते हैं:

sessionFactory.getCache(); 
entityManager.getCache(); 
संबंधित मुद्दे