Volgens Hibernate JavaDoc kunt u org.hibernate.Cache.evictAllRegions()
gebruiken :
evictAllRegions() Verwijder alle gegevens uit de cache.
Sessie en SessionFactory gebruiken:
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) Als u slechts één entiteit wilt bijwerken (als u rechtstreeks vanuit db alleen bepaalde entiteiten bijwerkt), niet de hele sessie, kunt u
evictEntityRegion(Class entityClass) Verwijdert alle entiteitsgegevens uit de gegeven regio (d.w.z.
2) Als je veel entiteiten hebt, die rechtstreeks vanuit db kunnen worden bijgewerkt, kun je deze methode gebruiken die alle entiteiten uit de cache van het 2e niveau verwijdert (we kunnen deze methode aan beheerders blootstellen via JMX of andere beheerderstools):
/**
* 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) Een andere benadering wordt hier beschreven voor postgresql+hibernate, ik denk dat je iets soortgelijks kunt doen voor Oracle zoals dit