2009-05-13 4 views
3

J'ai une paire d'entités Hibernate, A et B, qui sont liées par une relation plusieurs-à-plusieurs bidirectionnelle, comme décrit here - c.-à-d., Chaque entité a un sac faisant référence à une collection de l'autre type d'entité, avec une table de liens comprenant la clé primaire de chaque entité.Hibernate L2 Mise en cache et relations many-to-many

J'utilise aussi la mise en cache Hibernate L2 pour mettre en cache les valeurs de collecte, comme ceci:

<bag name="xyz" table="XYZ" ...> 
    <cache usage="nonstrict-read-write"/> 
</bag> 

Le problème que je me rends compte que lorsque je mets à jour la relation d'un côté, la collection en cache des éléments de la l'autre côté n'est pas mis à jour.

Par exemple:

A a = session.get(1L, A.class); 

B b = a.getBs().get(0); 
Long bId = b.getId(); 

a.getBs().remove(0) // delete the B from A 
// ... flush and commit the transaction... 

B b2 = session.get(bId, B.class); 
Collection<A> as = b2.getAs(); 

Collection comme contient encore une référence à un, même si l'état de base de données reflète le fait que la relation a été supprimée. Après avoir invalidé le cache, Hibernate retournera les résultats corrects.

Est-ce que hibernate a des mécanismes pour gérer l'invalidation du cache des entités liées, ou est-ce que je devrais supprimer la relation des deux extrémités? Je utilise Hibernate 3.2.6.

Répondre

1

Par définition, vous devez supprimer des deux côtés. Il est logique de une perspective technique car fondamentalement les deux collections sont mises en cache indépendamment .

Bien sûr, c'est un non-sens d'un point de vue pratique et beaucoup de gens trébucheront dessus.