2011-07-26 4 views
3

Je veux désactiver la mise en cache de mise en veille prolongée.Hibernate désactivant le cache

session.setCacheMode(CacheMode.IGNORE) ne fonctionne pas.
query.setCacheable(false) ne fonctionne pas non plus.

En outre, puis-je configurer d'une certaine manière que la mise en cache ne sera pas effectuée pour les objets X, Y mais sera effectuée pour l'objet Z?

Merci.

+1

Pouvez-vous être plus précis au sujet de * quel * cache d'hibernation auquel vous faites référence? Il y a le cache de session/de premier niveau, le cache de second niveau, le cache de requête et le cache de collection. –

+0

je fais référence au cache de session – AAaa

Répondre

1

J'ai cherché sur le web et la conclusion est qu'en effet un cache de session ne peut pas être désactivé. C'est très étrange. Ma solution pour moi-même est d'utiliser session.clear() quand je veux que le cache soit effacé.

+0

ne fonctionne pas, j'ai déjà essayé session.clear(); Les mises à jour db directes ne s'affichent pas en veille prolongée. s'il vous plaît laissez-moi savoir si vous aviez compris quelque chose d'autre. –

+0

Travaillez pour moi. Vous pouvez également essayer de fermer et d'ouvrir une nouvelle session. –

3

essayer quelque chose comme ça lors de la configuration usine de la session de mise en veille prolongée:

configuration.setProperty(Environment.USE_QUERY_CACHE, Boolean.FALSE.toString()); 
configuration.setProperty(Environment.USE_SECOND_LEVEL_CACHE, Boolean.FALSE.toString()); 
configuration.setProperty(Environment.CACHE_REGION_FACTORY,org.hibernate.cache.impl.NoCachingRegionFactory.class.getName()); 
configuration.setProperty(Environment.CACHE_PROVIDER,org.hibernate.cache.NoCacheProvider.class.getName()); 

Notez toutefois que vous ne pouvez pas désactiver la session cache qui est fourni par Hibernate (Si toutes les implémentations JPA) Les. Si quelque chose ne doit pas être mis en cache par Hibernate, vous pouvez l'expulser OU ne pas utiliser Hibernate (selon votre choix)

Pour la mise en cache d'entités spécifiques, je vous recommande de jeter un oeil à javax.persistence.Cacheable et voyez comment cela fonctionne pour vous.

+0

êtes-vous sûr qu'il n'y a aucun moyen de désactiver le cache de session? semble étrange .. que se passe-t-il si je veux rapprocher l'objet DB avant et après le changement? est le seul wasy est-il l'utilisation d'expulser? – AAaa

+0

Je suis assez sûr ... Lorsque vous traitez avec des entités Hibernate, vous avez affaire à objets à une session. Appeler Session.get() sur lesdites entités devrait vous renvoyer le même handle d'objet (ou un proxy desdites entités) –

7

Vous pouvez appeler session.clear() juste avant d'obtenir un objet de session réutilisable du gestionnaire.

I.e. Dans notre projet, nous devions synchroniser les mises à jour entre plusieurs sessions d'hibernation (une par session http). Le cache de 2ème niveau fonctionne correctement mais le 1er niveau (par session) doit être désactivé ou effacé. Nous avons donc créé SessionManager qui stocke toutes les sessions et les livre à la demande. Juste avant de livrer appel session.clear() et cela résout le problème.

Jusqu'à ce que vous fassiez votre unité de travail - cache de 1er niveau est très bien.