Enligt Hibernate JavaDoc kan du använda org.hibernate.Cache.evictAllRegions()
:
evictAllRegions() Ta bort all data från cachen.
Använda Session och 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) Om du behöver uppdatera endast en entitet (om direkt från db kommer du bara att uppdatera vissa entiteter) inte hela sessionen, kan du använda
evictEntityRegion(Class entityClass) Avhyser all enhetsdata från den givna regionen (dvs.
2) Om du har många enheter, som kan uppdateras direkt från db, kan du använda den här metoden som vräker alla enheter från 2:a nivås cache (vi kan exponera den här metoden för administratörer genom JMX eller andra adminverktyg):
/**
* 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) Ett annat tillvägagångssätt beskrivs här för postgresql+hibernate, jag tror att du kan göra något liknande för Oracle så här