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)セッション全体ではなく、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でも同様のことができると思います