2014-12-07 105 views
0

我第一次嘗試根據不同的教程使用二級緩存,它不起作用。我有類:休眠二級緩存,一對多

@Entity 
@Table(name="TABLE_NAME") 
@org.hibernate.annotations.Cache(usage=CacheConcurrencyStrategy.READ_ONLY) 
public class Foo { 

@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private int id; 


@OneToMany(mappedBy = "foo", cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
private List<Sentence> collection_name; 

和配置在我的hibernate.cfg.xml文件

<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property> 
<property name="hibernate.cache.use_second_level_cache">true</property> 
<property name="hibernate.cache.use_query_cache">true</property> 

我打開

<property name="show_sql">true</property> 

我認爲第二個查詢不會打的數據庫,但它確實如此。

我查詢:

List<Foo> result = session.createQuery("select p from Foo p order by size(p.collection_name) desc ").list(); 

有什麼不對?

回答

0

如果你希望緩存你的HQL quert結果,你必須樂器查詢:

List<Foo> result = session 
         .createQuery("select p from Foo p order ... ") 
         .setCacheable(true) 
         .list(); 

Additionaly你可以告訴休眠模式,該高速緩存配置(緩存區)應使用:

List<Foo> result = session 
         .createQuery("select p from Foo p order ... ") 
         .setCacheable(true) 
         .setCacheRegion("foo_region") 
         .list(); 

當然,全局設置hibernate.cache.use_query_cache必須設置爲true。上的實體類

@Cache註釋用於緩存單個實體,當它被取出由ID

Foo foo = session.get(Foo.class, fooId);