2011-05-27 151 views
0

嗨在我的應用程序中,我有幾個小表,我緩存他們全部在服務器啓動一個地圖。我想Ecache來實現相同的功能+ hibernate的組合與Echache +休眠緩存

我的課看起來像

@Entity 
    @Table(name = "Order") 
    @NamedQueries 
    ({ 
    @NamedQuery(name="Order.findBySource", 
     query="from Order a where a.source = :source"), 

    @NamedQuery(name="Order.findByAll", 
     query="from Order"), 

    @NamedQuery(name="Order.findByPrioritySource", 
     query="from Order a where a.priority = :priority and a.source = :source"), 

    @NamedQuery(name="Order.findByPriority", 
     query="from Order a where a.priority = :priority"), 

    @NamedQuery(name="Order.findByWhenModified", 
     query="from Order a where a.whenModified = :whenModified") 
    }) 
     @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 

    public class Order implements java.io.Serializable { 

     private String source; 
     private long priority; 
     private Date whenModified; 
    } 

這個順序表幾乎沒有10個條目,我想保留此表中存儲所有的時間。 任何見解我如何實現這一目標?

我啓動上述命名查詢來獲取訂單。我不想一次又一次地去DB,當我在這個ecache.xml中啓動這個查詢時,我需要輸入這個類嗎?或者我需要在ecache.xml中緩存這些命名的查詢?

是否有可能通過Ehcache複製Map實現。這樣我就可以通過指定緩存中的ID而不必再次敲擊數據庫來獲取對象?

回答

2

你需要的是Hibernate查詢緩存。首先,您需要通過將hibernate.cache.use_query_cache屬性設置爲true來在Hibernate級別啓用它。然後,當你在代碼中執行查詢你需要設置一個標誌查詢對象上,以表明它需要緩存:

Query q = session.getNamedQuery("Order.findByPriority"); 
q.setCacheable(true); 
List result = q.list(); 
+0

另見http://ehcache.org/documentation/hibernate.html的正確配置緩存使用查詢。在閱讀本文檔之前,我有一些問題。 – jbrookover 2011-06-04 13:29:09