我们使用以下属性在休眠中启用了二级缓存:
hibernateProperties.setProperty("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory");
hibernateProperties.setProperty("hibernate.cache.use_query_cache", Boolean.TRUE.toString());
hibernateProperties.setProperty("hibernate.cache.use_second_level_cache", Boolean.TRUE.toString());
hibernateProperties.setProperty("hibernate.cache.use_structured_entries", Boolean.TRUE.toString());
hibernateProperties.setProperty("hibernate.cache.generate_statistics", Boolean.TRUE.toString());
并使用缓存标签标记我们的实体:
@Entity
@Indexed
@Table(name = "item")
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class Item implements Serializable {
这个实体有一个惰性集合,带有额外的惰性集合选项:
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
@ManyToMany(fetch = FetchType.LAZY, targetEntity = User.class, mappedBy = "likes")
@LazyCollection(LazyCollectionOption.EXTRA)
private List<User> users;
这似乎运作良好,在数据缓存后我看不到任何数据库查询,但我们看到的是调用日志
select count(user_id) from user_items where item_id =?
有没有办法让休眠来缓存惰性集合的大小,这样我们在执行 users.size() 时就不需要访问数据库?
我已更改为 CacheConcurrencyStrategy.READ_WRITE 并看到相同的行为。
在第一个请求中,我看到选择实体的查询和查找集合大小的查询。我看到日志消息说实体正在被缓存。
在随后的请求中,没有调用加载实体,但仍然调用查找集合的大小。