Können wir JPA2-Annotationen verwenden, um Assoziationen zwischenzuspeichern?

9

Ich verwende jetzt die JPA2 @Cacheable-Annotation für meine Entitäten, und alles funktioniert gut.

Ich muss jetzt eine ManyToOne-Assoziation zwischenspeichern.

Im klassischen Hibernate war es notwendig, die Assoziation mit @Cache zu kommentieren.

%Vor%

Und das funktioniert. Aber es scheint, dass wir die JPA2 @Cacheable-Annotation nur für die Entität selbst verwenden können.

Fehle ich etwas oder war das JPA-Komitee zu dunkel, um zu erkennen, dass Assoziationen ebenso zwischengespeichert werden müssen wie Entitäten? Sicherlich kann es nicht die dunkle Option sein?

    
Dick Chesterwood 16.01.2013, 18:33
quelle

2 Antworten

4

Ich denke, nach einigen Recherchen kann ich meine eigene Frage beantworten. Der Schlüssel ist, dass Hibernate Objekte in der 2LC dehydriert und dies beeinflusst, ob Sie die Assoziationen explizit zwischenspeichern müssen.

Bitte fügen Sie weitere Details hinzu, wenn ich etwas verpasst habe oder Details falsch verstanden habe.

Hier ist eine vereinfachte Klassenstruktur:

%Vor%

Für den Ruhezustand

Der Second Level Cache (2LC) speichert Entitäten in einer dehydrierten Form, zB:

%Vor%

Die letzte 1 in den Schülerdaten ist der Fremdschlüssel zum Tutor.

Wenn Sie also einen Verweis auf die Schüler-ID 1 haben und dem Verweis auf den Tutor folgen, erhalten wir einen Cache-Treffer, weil der Fremdschlüssel im Cache ist. Es ist keine zusätzliche Auswahl erforderlich.

Wenn Sie jedoch andersherum getStudents () auf dem Tutor aufrufen, gibt es in der 2LC keinen Fremdschlüssel, sodass eine Auswahl erforderlich ist. (Sobald die Auswahl abgeschlossen ist, hat der Ruhezustand die IDs und kann beginnen, die 2LC zu treffen).

Um dies zu vermeiden, müssen Sie die alte org.hibernate.annotations.Cache-Annotation zu der @ OneToMany-Beziehung hinzufügen.

Für EclipseLink

Ich habe keine EclipseLink-Installation zur Hand, daher kann ich das nicht testen, aber ich verstehe, dass EclipseLink die 2LC-Daten in der Form des ursprünglichen Objektdiagramms speichert, daher ist das Obige nicht relevant. Laut Chris 'Antwort wird die Entität mit ihren Referenzen zwischengespeichert, so dass eine weitere Kommentierung nicht erforderlich ist.

    
Dick Chesterwood 17.01.2013, 18:24
quelle
0

Der Cache von JPA bezieht sich auf die Entitätsobjekte selbst. Solange die Entität zwischengespeichert wird, gilt dies auch für alle Referenzen. Die referenzierten Entitätsobjekte hätten jedoch ihre eigenen Cache-Optionen.

    
Chris 16.01.2013 18:44
quelle