Ich habe eine Eins-zu-Viel-Beziehung: Übergeordneter Datensatz mit n untergeordneten Datensätzen. Diese Datensätze werden häufig verwendet und sind schreibgeschützt und eignen sich gut für die Zwischenspeicherung.
Hier ist eine Annäherung an meine Hibernate-Zuordnung:
`<class name="Parent" table="Parent>
<cache usage="read-only"/>
<id name="primary_key"/>
<property name="natural_key"/>
<set name="children" lazy="false" fetch="join">
<cache usage="read-only"/>
<key-column name="parent_id"/>
<one-to-many class="Child"/>
</set>
</class>
<class name="Child" table="Child">
<cache usage="read-only"/>
<id name="primary_key"/>
<property name="parent_id"/>
</class>`
Ich rufe das Elternteil häufig über einen natürlichen Schlüssel und nicht über einen Primärschlüssel ab, so dass ich Query Caching aktivieren muss, um den 2nd Level Cache zu nutzen (ich verwende ehcache).
Hier ist das Problem: Wenn ich ein Elternteil abrufe und einen Treffer im Abfrage-Cache erhalte, wird daraus eine "Abruf nach Primärschlüssel"-Abfrage. Dies ist gut für das "eine" Ende meiner One-to-Many-Abfrage. Wenn das Elternteil nicht im Cache gefunden wird, wird es aus der DB abgerufen. Wenn meine n Child-Datensätze nicht im Cache gefunden werden, holt Hibernate sie mit n nachfolgenden Select-Abfragen. N+1 select Problem.
Was ich will ist eine Möglichkeit, die Sammlung von Child-Objekten, die durch die parent_id verschlüsselt sind, zwischenzuspeichern. Ich möchte, dass Hibernate im Cache nach meiner Sammlung als Ganzes sucht und nicht nur nach einzelnen Datensätzen. Wenn die Sammlung nicht gefunden wird, möchte ich, dass Hibernate die Sammlung mit einer Select-Anweisung abruft - alle Childs mit parent_id=x abrufen.
Ist das zu viel verlangt von Hibernate + ehcache?