Решить это было довольно просто. Следующий код может использоваться для переключения кэша второго уровня для сущностей во время выполнения:
@Slf4j
@UtilityClass
public class HibernateUtil {
public static void disableCache(EntityManager em, String entityName) {
toggleCache(em, entityName, false);
}
public static void enableCache(EntityManager em, String entityName) {
toggleCache(em, entityName, true);
}
private static void toggleCache(EntityManager em, String entityName, boolean enableCache) {
final Optional<EntityPersister> persister = getEntityPersister(em, entityName);
persister.ifPresentOrElse(p -> {
log.info("Toggling cache for '{}': {}", entityName, enableCache);
ClassUtil.writeField(p, "canReadFromCache", enableCache);
ClassUtil.writeField(p, "canWriteToCache", enableCache);
}, () -> log.warn("Entity '{}' could not be found", entityName));
}
private static Optional<EntityPersister> getEntityPersister(EntityManager em, String entityName) {
final MetamodelImplementor model = (MetamodelImplementor) em.getMetamodel();
final Collection<EntityPersister> persisters = model.entityPersisters().values();
return persisters.stream().filter(e -> e.getEntityName().equalsIgnoreCase(entityName))
.findFirst();
}
}