2016-04-24 9 views
1

Ich habe ehcache mit Hibernate und Hibernate arbeiten mit Feder-Daten arbeiten und alle Frameworks arbeiten normal zusammen. Zum Beispiel, wenn ich die Methode 'T findOne (ID var1);' der Klasse CrudRepository funktioniert alles einwandfrei und der Wert wird aus einem Cache genommen.So erzwingen Federdaten, um Entitäten für findAll-Methode von CrudRepository im Cache zuerst zu finden, und erst danach in Datenquellen

Ich erwarte, dass dieses Verhalten auf die Methode 'Iterable findAll (Iterable var1)' anwendbar sein sollte; ' weil es leicht sein sollte, nach jeder bestimmten ID zu suchen, wenn sie im Cache vorhanden ist, und dann eine Abfrage basierend darauf zu bilden, welche IDs bereits im Cache gefunden werden und welche nicht. Zum Beispiel, wenn ich Elemente mit IDs {1,2,3} im Cache habe und ich findAll ({1,3,4,5}) aufrufen möchte, sollte die Abfrage nur {4,5} enthalten. Auch wenn ich findAll aufrufen ({1,3}) - keine Abfrage an die Datenquelle sollte überhaupt erfolgen und alle Daten sollten aus dem Cache genommen werden.

Das sind meine Erwartungen. In Wirklichkeit bilden Sprungdaten jedoch immer eine vollständige Anfrage, selbst wenn alle IDs bereits im Cache sind. Irgendwelche Vorschläge, wie man das erwartete Verhalten erzwingt?

ps: Ich weiß, dass ich Abfragen zwischenspeichern kann, aber dieser Fall ist ganz anders, ich möchte Abfrage nicht durch Argumente zwischenspeichern, ich möchte Argumentliste als separate Elemente behandelt werden, die aus dem Cache entnommen werden können getrennt (aber wenn einige Elemente abgefragt werden müssen, sollte dies durch eine Abfrage geschehen, nicht viele!)

Antwort

1

Es scheint, dass es nicht möglich ist mit dem Basis-Quelldaten-jpa-Repository (jpa hat keine API zum Abrufen von mehreren IDs für jetzt) .

Aber können Sie versuchen, zu

Natürlich, wenn Sie Hibernate 5.1+ verwenden.

Es sollte L2-Cache mit MultiIdentifierLoadAccess.with mathod (https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/MultiIdentifierLoadAccess.html#with-org.hibernate.CacheMode-)

Hoffe, es hilft bei der Verwaltung.

+0

Thx, erste Lösung funktioniert gut für mich. – user3231055