Ich habe eine Spring Boot App mit Spring Data JPA (Hibernate Backend) Repository-Klassen. Ich habe ein paar benutzerdefinierte Finder-Methoden, einige mit spezifischen @Query
Annotation hinzugefügt, um es zu sagen, wie Sie die Daten erhalten. Ich habe bereits EhCache für den Ruhezustand-2nd-Level-Cache eingerichtet, aber bis jetzt ist der einzige Weg, wie ich diese Ergebnis-Caching erhalten kann, den Hibernate-Abfrage-Cache zu aktivieren. Ich würde es vorziehen, einen bestimmten Cache zu definieren und die eigentlichen Domain-Objekte dort zu speichern, als wäre es ein normaler Finder. Unten ist mein Repo-Code:Wie Zwischenergebnisse einer Spring Data JPA-Abfragemethode ohne Abfrage-Cache gespeichert werden?
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);
}
Und hier ist die "promotionServiceXrefByCustomerId" Cache I definiert sind, dass nicht verwendet wird:
<cache name="promotionServiceXrefByCustomerId" overflowToDisk="true" diskPersistent="true"
maxEntriesLocalHeap="3000000" eternal="true" diskSpoolBufferSizeMB="20" memoryStoreEvictionPolicy="LFU"
transactionalMode="off" statistics="true">
</cache>
Was mache ich falsch? Wenn ich StandardQueryCache
aktiviere, werden diese Daten dort zwischengespeichert und Hibernate führt keine Abfrage aus. Aber wenn ich das Zwischenspeichern der Abfrage deaktiviere, wird dies nicht zwischengespeichert. Was mache ich hier falsch? Bitte helfen!
Warum sollte die '@ Cache' Annotation irgendetwas für eine Nicht-Entität tun? Diese Annotation soll sich auf Entitäten befinden, die sich nicht auf beliebigen Klassen oder Interfaces befinden. –
Ich versuche es herauszufinden ... also würde jede Hilfe geschätzt werden. Die anderen find ... -Methoden, die im PagingAndSortingRepository angegeben sind, die zur Laufzeit von Spring erstellt werden, ermöglichen das Caching mit dem Second-Level-Caching von JPA/Hibernate. Das funktioniert einwandfrei. Aber diese Finder-Methode, die ich erstellt habe, kann ich nicht herausfinden, wie man IT in den Cache bringt ... –
Ich bezweifle, dass die 'findAll' Caching ist, wenn Sie Caching-Anmerkungen auf Ihre Entitäten (wo sollten sie gehen). Wenn Sie versuchen (oder erwarten), dass eine nicht zwischenspeicherbare Entität zwischengespeichert wird, funktioniert sie nicht. In diesem Fall funktioniert nur der Abfragecache. –