Я пытаюсь понять, как на самом деле работает кеш запросов Hibernate.
Теперь я вижу, что Hibernate не обновляет свой кэш второго уровня автоматически, когда я вставляю новые объекты в базу данных (хотя я использую только вызовы Hibernate).
Единственный способ заставить его работать - это очистить кеш вручную после вставки новых сущностей.
Вот более конкретный пример.
У меня есть постоянная сущность под названием Контейнер, которая может иметь много предметов. Я хотел, чтобы все элементы кэшировались:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Item
{
// rest of the code ...
}
class Container {
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)<br>
public List getItems() { ... }
// rest of the code ...
}
Проблема, которую я заметил, заключается в том, что когда я:
1) чтение некоторых Контейнеров из БД в память (вместе с соответствующими элементами)
String hql =
"from Container c left join fetch c.items where c.type = 1";
List<Item> list = hibernateTemplate.find(hql);
2) вставить новый пункт для выбранного контейнера
hibernateTemplate.save(item)
3) повторить первый шаг
затем на третьем шаге я не вижу элемент, который я вставил на втором шаге.
Я вижу их, только если я очищаю кеш вручную после вставки новых элементов:
sessionFactory.evictCollection("Container.items", updatedContainerId)
Мои интуитивные ощущения подсказывают мне, что Hibernate должен автоматически делать такую аннулирование кэша. Кто-нибудь видел, как это работает? Я что-то не так делаю или просто не поддерживается?
Заранее спасибо за ответ.
Привет
Том