我想澄清一下关于hibernate二级缓存的一些观点。需要澄清的是,HQL查询是否总会碰到数据库(至少是为了获得ID)。请问HQL查询使用Hibernate二级缓存
考虑,我们有实体
class Customer {
long id; // Primary key
String name;
set <Address> addressList; // One to many relationship
}
class Address{
long id; // Primary key
String houseName;
}
的地址数据库表有外键参考客户(ID),以支持一对多的关系。
作为一个先决条件,我已经为Hibernate启用了2级缓存作为EHcache。只有实体和关联被设置为可缓存。查询缓存未启用。
我知道,如果我多次使用session.get()或session.load(),只有第一次调用将启动对数据库的查询,并且后续的将从第2级缓存中获取数据。
我的问题是
1)请问HQL会利用二级缓存。 在一个会话中,我执行一个HQL以使用主键(id)“从Customer c where c.id =?”).setParameter(1,1005)获取对象。
如果我在不同的会话中运行相同的HQL,Customer对象是从2级缓存中取出还是再次打到数据库。
2)考虑选择客户和关联地址的另一个HQL执行from Customer as c left join fetch c.addressList
。
如果我在不同的会话中运行相同的HQL,将关联的地址从二级缓存中取出,否则它将再次访问数据库。
是的,HQL使用第二级缓存,但前提是您将'hibernate.query_cache'设置为true并在查询中使用'setCacheable(true)'。 –