J'ai une relation un-à-plusieurs: enregistrement parent avec n enregistrements enfants. Ces enregistrements sont fréquemment utilisés et en lecture seule et sont de bons candidats pour la mise en cache.Éviter les sélections n + 1 avec les associations Hibernate mises en cache ou les mises en cache dans leur ensemble
Voici une approximation de mon mapping Hibernate:
`<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>`
Je vais chercher souvent le parent par une clé naturelle, plutôt que d'une clé primaire, donc je dois activer le cache de requêtes afin de tirer profit de la Cache de second niveau (j'utilise ehcache).
Voici le problème: lorsque je récupère un parent et obtiens un hit dans le cache de requête, il devient une requête "récupérer par clé primaire". C'est bien pour le "un" fin de mon un-à-plusieurs. Si le parent n'est pas trouvé dans le cache, il est extrait de la base de données. Si mes n Enregistrements enfants ne sont pas trouvés dans le cache, Hibernate les récupère en utilisant n requêtes select suivantes. N + 1 sélectionnez le problème.
Ce que je veux est un moyen de mettre en cache la collection d'objets enfant, avec le parent_id. Je veux qu'Hibernate cherche ma collection dans le cache dans son ensemble, plutôt que comme un ensemble d'enregistrements individuels. Si la collection n'est pas trouvée, je veux que Hibernate récupère la collection en utilisant 1 instruction select - récupère tous les enfants avec parent_id = x.
Est-ce trop demander à Hibernate + ehcache?
Merci d'avoir posté une réponse détaillée. +1 tout autour. –