hibernate getResultList () возвращает различные данные - PullRequest
1 голос
/ 21 октября 2010

Я работаю с JPA (1.0 или 2.) + hibernate (3.4.0 или 3.6.0), и у меня возникла проблема с кешированием. Что я делаю:

  1. Найти объект с моим классом JPA (строка в базе данных с определенным идентификатором)
  2. обновить логический флаг на объекте (поле tinyint в базе данных)
  3. сохранить объект
  4. получить всю таблицу из базы данных с помощью getResultList () в надежде отразить изменение.

Проблема:

Изменение отражается в getResultList при первом его вызове, но при втором отображении предыдущего состояния. Третий раз показывает правильно; четвертое, предыдущее состояние; и т. д. Кажется, что они чередуются между двумя состояниями каждый раз, когда я вызываю getResultList для таблицы.

Код для № 3 выше:

EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
entityManager.persist(object);
entityTransaction.commit();
entityManager.refresh(object);

Код для № 4:

Query query = entityManager.createQuery("from " + object.getName());
List<T> resultList = query.getResultList();

В моих усилиях по решению проблемы у меня есть:

1. Отключил L2 и кеш запросов в файле persistence.xml с:

<property name="hibernate.cache.use_query_cache" value="false"/>
<property name="hibernate.cache.use_second_level_cache" value="false"/>

2. принудительно вытеснил кеш перед запуском getResultList () с помощью (используя JPA 2.0):

entityManager.getEntityManagerFactory().getCache().evictAll()

3.пробовал вызвать refresh () повсюду - безрезультатно.

Я что-то упустил?

Буду признателен за любую помощь.

Спасибо, подачка

Ответы [ 3 ]

1 голос
/ 21 октября 2010

Я сталкивался с этой проблемой раньше (или с чем-то очень похожим) с несколькими разными провайдерами JPA.Убедитесь, что вы явно закрываете свои EntityManager.

0 голосов
/ 23 октября 2010

Ну, Стивен, на самом деле ваше решение наконец-то помогло.В моем приложении я вызываю свои методы обновления из сервлета.Проблема исчезла, как только я закрыл EntityManager, прежде чем вызывать любой из моих методов.Я до сих пор не знаю, почему это работает.

При более внимательном рассмотрении проблемы я обнаружил, что проблема заключалась не в getResultList (), а в том случае, когда я выполнял find () для данного объекта после его обновления, функция find ()чередовать два объекта с разными хешами, но одинаковыми идентификаторами (разный хеш был результатом того, что установлен логический флаг или нет)сделай это.

0 голосов
/ 21 октября 2010

Я не думаю, что entityManager.refresh(object); необходимо. Режим сброса по умолчанию - Авто, поэтому EntityManager будет сбрасывать (синхронизировать контекст постоянства с базовой базой данных) при выполнении запроса.

Кроме того, каждый запрос влечет за собой запрос SQL из базы данных?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...