2009-03-31 8 views
5

Tôi đang sử dụng giải pháp Hibernate làm giải pháp ORM của mình, với EHCache là bộ nhớ cache Cấp độ thứ hai (Đọc-Ghi).Thao tác với Bộ nhớ Cache Cấp 2 Hibernate

Câu hỏi của tôi là: Có thể truy cập bộ nhớ cache Cấp Thứ hai trực tiếp không?

tôi muốn truy cập này: http://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/ReadWriteCache.html

Làm thế nào tôi có thể truy cập vào ReadWriteCache cùng đang được sử dụng bởi Hibernate?

Tôi có một số chèn JDBC trực tiếp/tùy chỉnh mà tôi đang thực hiện và tôi muốn tự thêm các đối tượng đó vào bộ nhớ cache cấp 2.

Trả lời

6

tôi sẽ gọi là "afterInsert" trên EntityPersister mà các bản đồ để tổ chức của bạn vì Read/Write là một chiến lược đồng thời không đồng bộ. Tôi đã ghép chúng lại với nhau sau khi xem qua nguồn Hibernate 3.3. Tôi không 100% rằng điều này sẽ làm việc, nhưng nó có vẻ tốt với tôi.

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

Tôi đã làm điều này bằng cách tạo ra nhà cung cấp bộ nhớ cache của riêng tôi. Tôi chỉ cần overrode EhCacheProvider và sử dụng biến của riêng tôi cho người quản lý để tôi có thể trả lại nó trong một tĩnh. Một khi bạn nhận được CacheManager, bạn có thể gọi manager.getCache (class_name) để có được Cache cho loại thực thể đó. Sau đó, bạn xây dựng một CacheKey bằng cách sử dụng khóa chính, loại, và tên lớp:

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

Cache là cơ bản một bản đồ để bạn có thể kiểm tra xem đối tượng của bạn là trong bộ nhớ cache, hoặc lặp thông qua các đối tượng .

Có thể có một cách để truy cập CacheProvider khi bạn xây dựng SessionFactory ban đầu để tránh sự cần thiết phải thực hiện của riêng bạn.

0

Cả hai ngủ đông và JPA hiện nay cung cấp truy cập trực tiếp đến cấp 2 bộ nhớ cache cơ bản:

sessionFactory.getCache(); 
entityManager.getCache();