我希望澄清一些关于Hibernate二级缓存的问题。需要澄清的是,HQL查询是否总是会访问数据库(至少获取ID)。
考虑我们有实体:
考虑我们有实体:
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的二级缓存作为EHcache。只有实体和关联被设置为可缓存。查询缓存未启用。
我知道如果我使用session.get()或session.load()超过一次,只有第一次调用会向数据库发出查询,随后的调用将从二级缓存中获取数据。
我的问题是
1)HQL是否利用了二级缓存。 在一个session中,我执行了一个HQL来使用主键(id)获取对象,“from Customer c where c.id = ? ”)。setParameter(1, 1005)。
如果我在另一个session中运行相同的HQL,那么客户对象是从二级缓存中获取还是会再次访问数据库。
2)考虑另一个执行的HQL from Customer as c left join fetch c.addressList
,用于选择客户和相关地址。
如果我在另一个session中运行相同的HQL,那么相关的地址会从二级缓存中获取还是会再次访问数据库。
hibernate.query_cache
设置为true并在查询上使用setCacheable(true)
时。 - Volodymyr Levytskyi