2010-03-14 1 views
1

Je suis une nouvelle venue en hibernation. Ce serait génial si quelqu'un pouvait commenter la requête suivante que j'ai:Hibernate - EhCache - Quelle région mettre en cache les associations/ensembles/collections?

Dites que j'ai une classe parente et que chaque parent a plusieurs enfants. Ainsi, le fichier de mappage de classe parent serait quelque chose comme:

parent.hbm.xml

<hibernate-mapping > 
<class name="org.demo.parent" table="parent" lazy="true"> 
<cache usage="read-write" region="org.demo.parent"/> 
<id name="id" column="id" type="integer" length="10"> 
<generator class="native"> 
</generator> 
</id> 
<property name="name" column="name" type="string" length="50"/> 

<set name="children" lazy="true"> 
<cache usage="read-write" region="org.demo.parent.children" /> 
<key column="parent_id"/> 
<one-to-many class="org.demo.children"/> 
</set> 

</class> 
</hibernate-mapping> 

children.hbm.xml

<hibernate-mapping > 
<class name="org.demo.children" table="children" lazy="true"> 
<cache usage="read-write" region="org.demo.children"/> 
<id name="id" column="id" type="integer" length="10"> 
<generator class="native"> 
</generator> 
</id> 

<property name="name" column="name" type="string" length="50"/> 

<many-to-one name="parent_id" column="parent_id" type="integer" length="10" not-null="true"/> 

</class> 
</hibernate-mapping> 

Donc, pour les enfants ensemble, devrait nous spécifions la région org.demo.parent.children où elle devrait mettre en cache l'association ou devrions-nous utiliser la région de cache de org.demo.children où les enfants seraient mis en cache. J'utilise EHCache comme fournisseur de cache de second niveau. J'ai essayé de chercher la réponse à cette question mais je n'ai pas pu trouver de réponse dans cette direction. Il est plus logique d'utiliser org.demo.children mais je ne sais pas dans quels scénarios on devrait utiliser une région de cache séparée pour les associations/sets/collections comme dans le cas ci-dessus. Veuillez fournir vos contributions également laissez-moi savoir si je ne suis pas clair dans ma question.

Merci à tous.

Répondre

2

Donc, pour les enfants ensemble, devrions-nous préciser la région org.demo.parent.children où il devrait mettre en cache l'association ou devrions-nous utiliser la région de cache de org.demo.children où les enfants seraient mises en cache se .

Par défaut, l'option region est réglé sur le nom du rôle classe ou collection. Ainsi, pour le set, le nom de région par défaut serait "org.demo.Parent.children" (c'est-à-dire différent du nom de région par défaut pour le Child qui serait "org.demo.Child"). Cela fait sens IMO puisque vous voulez pouvoir invalider une collection particulière ou toutes les collections dans une région sans invalider toutes les entités du type d'une collection. Mais en fait, la grande question ici est: pourquoi diable n'utilisez-vous pas les valeurs par défaut? Vous introduisez du travail supplémentaire, de la maintenance et des sources potentielles de problèmes et je n'arrive pas à comprendre les avantages. En tant que fan des conventions sur la configuration, j'utilise la valeur par défaut (c'est-à-dire que je ne définis pas region).

+0

Merci pour la réponse. "Cela fait sens IMO puisque vous voulez pouvoir invalider une collection particulière ou toutes les collections dans une région sans invalider toutes les entités du type d'une collection." Voulez-vous dire dans la configuration de cache ci-dessus? Il est avantageux d'avoir deux régions de cache différentes pour les enfants. Je n'ai pas compris comment ?? aimablement élaborer. Qu'en est-il de la cohérence? Si l'une des régions (org.demo.parent.children) était mise à jour, l'autre région de cache pour les enfants (org.demo.children) ne refléterait pas le changement. Ne cause-t-il pas une incohérence? Veuillez préciser. – user293297

+0

@lifeisnotfair Je ne suis pas sûr de vous avoir. Premièrement, êtes-vous d'accord pour modifier une collection en ajoutant/supprimant des éléments sans modifier les éléments eux-mêmes? Je ne vois aucune source d'incohérence ici.Deuxièmement, Hibernate gère le cache/les régions pour vous, donc vous n'avez pas à vous en préoccuper. Et c'est une raison de plus d'utiliser les valeurs par défaut (surtout si vous êtes nouveau sur Hibernate) au lieu d'essayer d'optimiser prématurément (et peut-être à tort) quelque chose qui n'est pas un problème. Si vous voulez affiner, faites-le plus tard. –

Questions connexes