Według Hibernate JavaDoc, możesz użyć org.hibernate.Cache.evictAllRegions()
:
evictAllRegions() Usuń wszystkie dane z pamięci podręcznej.
Korzystanie z sesji i 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) Jeśli potrzebujesz zaktualizować tylko jedną encję (jeśli bezpośrednio z bazy danych zaktualizujesz tylko niektóre encje), a nie całą sesję, możesz użyć
evictEntityRegion(Class entityClass) Eksmituje wszystkie dane encji z danego regionu (np.
2) Jeśli masz dużo encji, które można zaktualizować bezpośrednio z bazy danych, możesz użyć tej metody, która eksmituje wszystkie encje z pamięci podręcznej drugiego poziomu (możemy udostępnić tę metodę administratorom za pomocą JMX lub innych narzędzi administracyjnych):
/**
* 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) Inne podejście jest opisane tutaj dla postgresql+hibernate, myślę, że możesz zrobić coś podobnego dla Oracle w ten sposób