Laut Hibernate JavaDoc können Sie org.hibernate.Cache.evictAllRegions()
verwenden :
evictAllRegions() Alle Daten aus dem Cache entfernen.
Verwendung von Session und 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) Wenn Sie nur eine Entität aktualisieren müssen (wenn Sie direkt von db aus nur bestimmte Entitäten aktualisieren), nicht die ganze Sitzung, können Sie
verwendenevictEntityRegion(Class entityClass) Entfernt alle Entitätsdaten aus der angegebenen Region (z. B.
2) Wenn Sie viele Entitäten haben, die direkt von db aktualisiert werden können, können Sie diese Methode verwenden, die alle Entitäten aus dem 2nd-Level-Cache entfernt (wir können diese Methode Administratoren über JMX oder andere Admin-Tools zugänglich machen):
/**
* 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) Ein anderer Ansatz wird hier für postgresql+hibernate beschrieben, ich denke, Sie können so etwas ähnliches für Oracle tun