Ifølge Hibernate JavaDoc kan du bruge org.hibernate.Cache.evictAllRegions()
:
evictAllRegions() Fjern alle data fra cachen.
Brug af Session og 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) Hvis du kun skal opdatere én enhed (hvis direkte fra db vil du kun opdatere visse entiteter) ikke hele sessionen, kan du bruge
evictEntityRegion(Class entityClass) Fjerner alle enhedsdata fra den givne region (dvs.
2) Hvis du har mange entiteter, som kan opdateres direkte fra db, kan du bruge denne metode, der fjerner alle entiteter fra 2. niveaus cache (vi kan eksponere denne metode for administratorer gennem JMX eller andre admin værktøjer):
/**
* 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) En anden tilgang er beskrevet her for postgresql+hibernate, jeg tror, du kan gøre noget lignende for Oracle som dette