Selon Hibernate JavaDoc, vous pouvez utiliser org.hibernate.Cache.evictAllRegions()
:
evictAllRegions() Supprime toutes les données du cache.
Utilisation de Session et SessionFactory :
Session session = sessionFactory.getCurrentSession();
if (session != null) {
session.clear(); // internal cache clear
}
Cache cache = sessionFactory.getCache();
if (cache != null) {
cache.evictAllRegions(); // Evict data from all query regions.
}
1) Si vous avez besoin de mettre à jour une seule entité (si directement à partir de la base de données, vous ne mettrez à jour que certaines entités) et non toute la session, vous pouvez utiliser
evictEntityRegion(Class entityClass) Expulse toutes les données d'entité de la région donnée (c'est-à-dire
2) Si vous avez beaucoup d'entités, qui peuvent être mises à jour directement à partir de la base de données, vous pouvez utiliser cette méthode qui expulse toutes les entités du cache de 2e niveau (nous pouvons exposer cette méthode aux administrateurs via JMX ou d'autres outils d'administration) :
/**
* Evicts all second level cache hibernate entites. This is generally only
* needed when an external application modifies the game databaase.
*/
public void evict2ndLevelCache() {
try {
Map<String, ClassMetadata> classesMetadata = sessionFactory.getAllClassMetadata();
Cache cache = sessionFactory.getCache();
for (String entityName : classesMetadata.keySet()) {
logger.info("Evicting Entity from 2nd level cache: " + entityName);
cache.evictEntityRegion(entityName);
}
} catch (Exception e) {
logger.logp(Level.SEVERE, "SessionController", "evict2ndLevelCache", "Error evicting 2nd level hibernate cache entities: ", e);
}
}
3) Une autre approche est décrite ici pour postgresql+hibernate, je pense que vous pouvez faire quelque chose de similaire pour Oracle comme ceci