Mam aplikację Spring Boot z klasami repozytorium Spring Data JPA (hibernate backend). Dodałem kilka niestandardowych metod wyszukiwania, niektóre z konkretną adnotacją @Query
, aby poinformować, jak pobrać dane. Skonfigurowałem już EhCache do hibernacji pamięci podręcznej drugiego poziomu, ale do tej pory jedynym sposobem, w jaki mogę uzyskać te buforowanie wyników, jest włączenie bufora zapytań hibernacji. Wolałbym zdefiniować konkretną pamięć podręczną i przechowywać rzeczywiste obiekty domenowe w taki sposób, jakby były zwykłym wyszukiwarką. Poniżej jest mój kod repo:Jak buforować wyniki metody zapytania Spring Data JPA bez korzystania z pamięci podręcznej zapytań?
public interface PromotionServiceXrefRepository extends PagingAndSortingRepository<PromotionServiceXref, Integer> {
@Query("SELECT psx FROM Customer c " +
"JOIN c.customerProductPromotions cpp " +
"JOIN cpp.productPromotion pp " +
"JOIN pp.promotion p JOIN p.promotionServiceXrefs psx " +
"WHERE c.customerId = ?1")
@QueryHints(@QueryHint(name = "org.hibernate.cacheable", value = "true"))
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region = "promotionServiceXrefByCustomerId")
Set<PromotionServiceXref> findByCustomerId(int customerId);
}
I tu jest "promotionServiceXrefByCustomerId" cache I zdefiniowane, że nie jest używane:
<cache name="promotionServiceXrefByCustomerId" overflowToDisk="true" diskPersistent="true"
maxEntriesLocalHeap="3000000" eternal="true" diskSpoolBufferSizeMB="20" memoryStoreEvictionPolicy="LFU"
transactionalMode="off" statistics="true">
</cache>
Co robię źle? Jeśli włączę StandardQueryCache
, wtedy dane zostaną tam zbuforowane, a hibernacja nie wykona zapytania. Ale kiedy wyłączę buforowanie zapytań, nie zostanie to zbuforowane. Co ja tu robię źle? PROSZĘ POMÓŻ!
Dlaczego adnotacja @ @ Cache powinna robić cokolwiek dla jednostki? Ta adnotacja ma się znajdować w jednostkach nie należących do dowolnych klas lub interfejsów. –
Próbuję to rozgryźć ... więc każda pomoc będzie doceniona. Inne znaleźć ... metody, które są określone w PagingAndSortingRepository, które są tworzone w środowisku wykonawczym przez Spring zapewniają buforowanie przy użyciu buforowania drugiego poziomu JPA/Hibernate. To działa poprawnie. Ale ta metoda znajdowania, którą stworzyłem, nie mogę wymyślić, jak zmusić IT do buforowania ... –
Wątpię, aby 'findAll' buforował, chyba że masz adnotacje buforujące na twoich jednostkach (i tam właśnie powinny iść). Jeśli próbujesz (lub spodziewasz się), że buforowany obiekt nie będzie buforowany, nie będzie działał, w takim przypadku będzie działać tylko pamięć podręczna zapytań. –