Menurut Hibernate JavaDoc, Anda dapat menggunakan org.hibernate.Cache.evictAllRegions()
:
evictAllRegions() Mengusir semua data dari cache.
Menggunakan Session dan 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) Jika Anda hanya perlu memperbarui satu entitas (jika langsung dari db Anda hanya akan memperbarui entitas tertentu) tidak seluruh sesi, Anda dapat menggunakan
evictEntityRegion(Class entityClass) Mengusir semua data entitas dari wilayah tertentu (yaitu
2) Jika Anda memiliki banyak entitas, yang dapat diperbarui langsung dari db, Anda dapat menggunakan metode ini yang menghapus semua entitas dari cache level 2 (kami dapat memaparkan metode ini kepada admin melalui JMX atau alat admin lainnya):
/**
* 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) Pendekatan lain dijelaskan di sini untuk postgresql+hibernate, saya pikir Anda dapat melakukan sesuatu yang serupa untuk Oracle seperti ini