2017-01-09 7 views
1

多くの記事(たとえばhere)を読んでいるので、与えられたエンティティに対してHibernateの第2レベルのキャッシュを有効にするには、@org.hibernate.annotations.Cacheアノテーションを介してエンティティに対してキャッシュ同時実行戦略を設定する必要があります。私も、このエンティティを取得し、いくつかのクエリに(query.setCacheable(true)使用して)、クエリ・レベルのキャッシュを使用し、それがうまく機能のほかにデータ転送オブジェクト(DTO)投影用のHibernate第2レベルキャッシュ

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

。私はPersonDtoにも@Cache注釈を設定する必要がありますか

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(); 

私の質問は、このようなクエリのためになるよう、DTO投影を使用してカスタムクエリに関連しますか?注釈なしでクエリを実行しようとしましたが、DTOが正常にキャッシュされました。

エンティティオブジェクトのみのアノテーションが必要な理由と、エンティティオブジェクト以外の他のオブジェクトがその必要がない理由を説明できますか?

ありがとうございました。

答えて

0

これは100%ではありませんが、手動でcacheabletrueに設定しています。

Personの注釈は、エンティティと同等です。

この場合、PersonDTOがキャッシュされているとは思いません。 select new PersonDTO(person.id, person.name) from Person person where person.id = 10という別のクエリを書く場合は、id == 10のPersonDTOが存在するかどうかをキャッシュ内で調べることはできません。エンティティキャッシュは、同じことを理解しているため、キャッシュされます。

クエリ自体がキャッシュされていると思います(つまり、TTLより前に再度実行され、キャッシュされた結果が発生した場合)。特定のnameパラメータでこのクエリを実行し、その名前を持つPersonDTOがキャッシュに存在していないことをキャッシュしています。それは理にかなっていますか?

+0

あなたの説明のおかげで、それは私のためのセンスを作る:) – Suchac

関連する問題