Според Hibernate JavaDoc, можете да използвате org.hibernate.Cache.evictAllRegions()
:
evictAllRegions() Изважда всички данни от кеша.
Използване на Session и 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) Ако имате нужда от актуализиране само на един обект (ако директно от db ще актуализирате само определени обекти), а не цялата сесия, можете да използвате
evictEntityRegion(Class entityClass) Изважда всички данни за обект от дадения регион (т.е.
2) Ако имате много обекти, които могат да бъдат актуализирани директно от db, можете да използвате този метод, който изхвърля всички обекти от кеша от 2-ро ниво (можем да изложим този метод на администратори чрез JMX или други администраторски инструменти):
/**
* 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) Тук е описан друг подход за postgresql+hibernate, мисля, че можете да направите нещо подобно за Oracle като това