2009-05-20 8 views
0

hibernateSession.createQuery ("select foo où id = 1");
// Cette commande renvoie l'élément avec l'ID 1.

// [BREAK POINT STOP] ==> Je vais dans MySQL et je supprime cet élément manuellement.
// [CONTINUER DU POINT DE RUPTURE]

hibernateSession.createQuery ("sélectionnez foo où id = 1");
// Cette commande renvoie aussi l'élément avec l'identifiant 1! :-(

Il est la même chose avec hibernateSession.flush()/hibernateSession.clean()
Je pense que je ne l'utilise pas bien mon cache de mise en veille prolongée ...Hibernate - Même résultat après la mise à jour/sélectionner

Répondre

1

Certainement un problème de mise en cache. Utilisez-vous Essayez de fermer la session et d'en extraire une nouvelle en usine

3

La première requête aura chargé cet objet dans la session de mise en veille prolongée Votre suppression de la ligne dans la base de données n'a aucun impact, puisque vous êtes en utilisant la même session

er besoin de démarrer une nouvelle session ou evict l'objet de la session.

1

Essayez cette

Object o = hibernateSession.createQuery("select foo where id = 1").uniqueResult(); 

// [BREAK POINT STOP] ==> I go in MySQL and I delete this item manualy. 

hibernateSession.evict(o); 
hibernateSession.createQuery("select foo where id = 1"); 

Si cela fonctionne, alors vous êtes problème est avec le cache L1. Le cache L1 est TOUJOURS là, est associé à un objet Session donné et est indépendant du cache L2 dont parle toute la documentation du cache d'hibernation. Le but du cache L1 est de satisfaire à l'exigence selon laquelle si vous obtenez deux fois le même objet de base de données dans la même session, les deux références satisferont r1 == r2.

Fondamentalement, l'utilisation de la mise en veille prolongée lorsqu'il peut y avoir des modifications simultanées à la base de données n'est pas simple.

Questions connexes