J'essaie de comprendre comment le cache de requêtes Hibernate fonctionne vraiment. Ce que je vois maintenant, c'est qu'Hibernate ne met pas automatiquement à jour son cache de second niveau lorsque j'insère de nouvelles entités dans la base de données (bien que j'utilise uniquement les appels Hibernate). La seule façon que j'ai trouvé pour le faire fonctionner était de nettoyer manuellement le cache après avoir inséré de nouvelles entités.invalidation automatique du cache de requêtes
Voici l'exemple le plus concret. J'ai une entité persistante appelée Container qui peut contenir plusieurs éléments. Je voulais avoir tous les éléments mis en cache:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) class Item { // rest of the code ... } class Container { @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public List getItems() { ... } // rest of the code ... }
Le problème que je l'ai remarqué est que lorsque je:
1) lu quelques conteneurs de la DB en mémoire (en même temps que les éléments correspondants)
String hql =
"from Container c left join fetch c.items where c.type = 1";
List<Item> list = hibernateTemplate.find(hql);
2) insérer un nouveau point et pour un conteneur choisi
hibernateTemplate.save(item)
3) répéter le sapin st étape
puis dans la 3ème étape je ne peux pas voir l'article que j'ai inséré dans la deuxième étape. Je vois que si je nettoyer le cache manuellement après l'insertion d'éléments nouveaux:
sessionFactory.evictCollection("Container.items", updatedContainerId)
Mon intuition me dit que Hibernate doit faire une telle invalidation du cache automatiquement. Est-ce que quelqu'un l'a vu fonctionner? Est-ce que je fais quelque chose de mal ou est-ce que ce n'est pas supporté?
Merci d'avance pour la réponse. Messages d'accueil Tom
Je viens de répondre à cela l'autre jour: http://stackoverflow.com/questions/4500221/hibernate-sqlquery-bypasses-hibernate-session-cache/10828200#10828200 –