我第一次尝试使用二级缓存根据不同的教程,它不起作用。我上课了:
@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 :(得分:0)
如果要缓存HQL队列结果,则必须检测查询:
List<Foo> result = session
.createQuery("select p from Foo p order ... ")
.setCacheable(true)
.list();
另外你可以告诉Hibernate它应该使用哪个缓存配置(缓存区域):
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);