#hibernate
#гибернация
Вопрос:
У меня есть отображенная коллекция, которая не обновляется, когда я добавляю элементы в эту коллекцию извне, в другом приложении.
Кэширование второго уровня отключено.
Пример…
session = HibernateDataSource.openSession();
User dao = (User) session.load(User.class, 2434152);
// No items now, this gives 0
System.err.println(dao.getItems().size());
session.close();
Thread.sleep(10000);
// Add an item outside, e.g. in PMA
session = HibernateDataSource.openSession();
HibernateDataSource.getSessionFactory().evict(User.class);
HibernateDataSource.getSessionFactory().evict(UserItem.class);
HibernateDataSource.getSessionFactory().evictCollection(User.class.getName() ".items");
dao = (User) session.load(User.class, 2434152);
// Still zero
System.err.println(dao.getItems().size());
session.close();
Я попробовал несколько решений при поиске в Google, например, установив коллекцию как «грязную». Ничего не сработало.
Есть ли что-то еще, на что я не посмотрел?
P.S. Сначала попробовал Hibernate 3.2.7. Обновлен до 3.3.2, никакой разницы.
Ответ №1:
Потратив 95% времени на взлом Hibernate, она была освобождена.
Проблема возникла из-за кэширования запросов MySQL, которое, несмотря на название, также кэширует наборы результатов для повторяемых операций чтения. Это связано с характером управления несколькими версиями в InnoDB MySQL.
Чтобы «установить новый момент времени для моментального снимка», оберните свою единицу работы в транзакцию, даже если есть только запросы select.
Дальнейшее чтение…