Я использую РАСШИРЕННЫЙ Постоянный контекст, потому что это позволит мне лениво загружать отношения одного объекта на объект, а также не будет требовать SELECT, прежде чем «слить» объект с постоянным контекстом.JPA/Hibernate Query возвращает исходные результаты
У меня есть DummyObject с:
A "Последнее обновление" Дата Поле
A One-многим
Этот объект обновляется каждый секунд в одной JVM через звонок em.merge(DummyObject)
.
В другом JVM, я запрашиваю для DummyObject делает вызов вроде следующего
em.createQuery("from DummyObject").getResultList();
Я также делаю запрос каждые секунды.
Проблема заключается в том, что объекты, являющиеся результатом запроса, имеют временную метку самого первого запроса после последовательных вызовов, хотя Hibernate генерирует правильный оператор SQL (когда я включаю ведение журнала) и базу данных получает обновления правильно (я проверял).
Я также пробовал всевозможные оптимистичные блокировки с помощью @Version безрезультатно. (См комментарии)
Другое дело, что это работает правильно, когда:
изменить PersistentContextType к TRANSACTIONAL (то, что не позволит мне лениво загрузите ONE МНОГО отношения)
я делаю EntityManager.clear() называют , прежде чем я сделать запрос выше (что также не позволит мне лениво загружать отношение ОДНОГО МНОГО ).
Почему мой запрос возвращает устаревшие данные? У меня есть no Включено кэширование второго уровня или кеширование запросов.
Я что-то не так? Есть ли что-то, что я могу установить через query.setHint (,)?
Может быть, я не понимаю "РАСПРОСТРАНЕНИЯ" против TRANSACTIONAL правильно.
Последнее обновление отображается как версия? – Surya
Просто попробовал это. Не работает. Я также попытался добавить явное поле «версия» и аннотировать его с помощью @Version. И не работал. – systemoutprintln
is equals и hashcode, смотрящий lastUpdated? вы видите дополнительные объекты, которые не входят в результат em.createQuery()? – zmf