2012-02-15 11 views
0

現在、メソッドキャッシュを実装するためにEhCacheを使用してSpring 3.1 Cacheを使用しています。私はfindByPK(呼び出した場合、それは、その後、以降それがキャッシュにヒットし、最初のデータベースに当たるので、メソッドのキャッシングの作品)Spring 3.1キャッシュAnnotation EhCache

@Cacheable("items") 
public Item findByPK(int itemID) { 
    String sql = "SELECT * FROM ITEM WHERE ITEM_ID = ?"; 
    Item item = getJdbcTemplate().queryForObject(sql, new Object[]{itemID}, new ItemRowMapper()); 
    return item; 
} 

@Cacheable("items") 
public List<Item> findAll() { 
    String sql = "SELECT * FROM ITEM"; 
    List<Item> items = getJdbcTemplate().query(sql,new ItemRowMapper()); 
    return items; 
} 

:以下のコードフラグメントを考えてみましょう。 findAll()と同上。しかし、findByPK()呼び出しがfindAll()によって返された結果を認識するようにspringを指示する方法はありますか?

答えて

1

これは主要なハックですが、それはあなたが必要な機能を与えるだろう:

@Cacheable("items") 
public Item findByPK(int itemID) { 
    String sql = "SELECT * FROM ITEM WHERE ITEM_ID = ?"; 
    Item item = getJdbcTemplate().queryForObject(sql, new Object[]{itemID}, new ItemRowMapper()); 
    return item; 
} 

@Cacheable("items") 
public List<Item> findAll() { 
    String sql = "SELECT * FROM ITEM"; 
    List<Item> items = getJdbcTemplate().query(sql,new ItemRowMapper()); 
    for (Item item : items){ 
     removeThenAddToCache(item.getID(), item); 
    } 
    return items; 
} 

@CacheEvict(value = "items", key="#itemID") 
public void removeThenAddToCache(int itemID, Item item) { 
    addToCache(item); 
} 

@Cacheable(value = "items", key="#itemID") 
public Item addToCache(int itemID, Item item) { 
    return item; 
} 
+3

あなたは春のプロキシを使用しているいない場合は、織りされている場合にのみ動作します。 – digitaljoel

+0

いいですね、試してみましょう! – arrehman

+0

@ digitaljoel agree – aweigold

関連する問題