用于数据传输对象(DTO)投影的Hibernate二级缓存

时间:2017-01-09 12:29:19

标签: java spring hibernate jpa caching

正如我在许多文章中读到的那样(例如here) - 要为给定实体启用Hibernate的二级缓存,我们需要通过@org.hibernate.annotations.Cache注释在实体上设置缓存并发策略。 / p>

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Person {

此外,我还在一些获取此实体的查询中使用查询级缓存(使用query.setCacheable(true)),并且运行良好。

我的问题与使用DTO投影的自定义查询有关,因此对于这样的查询:

Query query = session.createQuery("SELECT new PersonDto(person.id, person.name) FROM Person person WHERE person.name = :name");
query.setParameter("name", name);
query.setCacheable(true);
query.uniqueResult();

我还需要为@Cache设置PersonDto注释吗?我试图在没有注释的情况下运行查询,并且DTO已成功缓存。

你能解释为什么我们只需要实体对象的注释而其他非实体对象不需要吗?

感谢。

1 个答案:

答案 0 :(得分:0)

我不是100%对此,但您手动将cacheable设置为true以进行查询。

Person上的注释与实体等效。

我不认为它是PersonDTO在此实例中被缓存。如果你要写另一个查询select new PersonDTO(person.id, person.name) from Person person where person.id = 10,我认为它不会查看你的缓存,看看是否存在id == 10的PersonDTO;然而,Entitys缓存会因为它理解它们是同一个东西。

我会想到它,因为查询本身正在被缓存(意味着如果在TTL之前再次运行,则会发生缓存结果)。它缓存了这样一个事实:您使用某个name参数运行此查询,而不是缓存中存在具有该名称的PersonDTO。这有意义吗?