Получить свежие данные для списка объектов - PullRequest
3 голосов
/ 17 декабря 2009

Мы используем jpa с Toplink в качестве реализации и столкнулись с проблемой обновления списков сущностей.

В основном это сценарий:

private List<Entity> findAll()
{
    final String sql = "SELECT e from " + anEntityClass.getSimpleName() + " e";
    final Query query = itsManager.createQuery(sql);
    List<Entity> result = query.getResultList();

    return result;
}

Но если мы изменим базу данных с помощью внешних средств, второй вызов метода findAll () вернет устаревшую информацию, поскольку он повторно использует информацию, хранящуюся в кэше.

Одним из решений этой проблемы является указание

query.setHint("toplink.refresh", "True");

Так что мы всегда получаем обновленные данные. Но тогда мы зависим от Toplink и столкнемся с проблемой, если нам потребуется сменить провайдера.

Я знаю, что есть метод entityManager.refesh (), но я видел его только в сочетании с entitytManager.find (), чтобы получить только одну сущность.

Существует ли какой-либо стандартный способ получения свежих данных для списка объектов?

Ответы [ 3 ]

1 голос
/ 17 декабря 2009

Я думаю, что это такая неприятная часть работы с JPA, и я столкнулся с некоторыми проблемами в ряде приложений. Практика, которую мы установили, заключается в том, чтобы на самом деле просто полностью очистить сессию и повторно выполнить запрос, который дал нам наш набор результатов для начала. Одна из проблем refresh () - каскады. Если вы лениво загрузили коллекции или другие ссылки, которые были извлечены в память, каждый из этих элементов также будет обновлен, что может сделать весь процесс длительным.

Но я должен сказать, что прагматичная сторона меня говорит о том, что вы настолько маловероятно, что смените своего поставщика персистентности, что если у вас есть что-то, что работает с TopLink, то просто продолжайте в том же духе. Узнайте, как наилучшим образом использовать имеющиеся у вас инструменты, и не беспокойтесь о вероятности, что когда-нибудь вам понадобится перейти в Hibernate или что-то еще.

1 голос
/ 04 января 2010

Вы можете установить свойство в файле persistence.xml, чтобы отключить кэширование для всех сущностей или для отдельных сущностей.

<persistence-unit name="local" transaction-type="RESOURCE_LOCAL">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <properties>
        <property name="toplink.cache.type.default" value="NONE" />
        <property name="toplink.cache.type.the.class.package.ClassName" value="NONE" />
    </properties>
</persistence-unit>

См. http://www.oracle.com/technology/products/ias/toplink/JPA/essentials/toplink-jpa-extensions.html#TopLinkCaching для получения дополнительной информации.

0 голосов
/ 17 декабря 2009

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

Вы также можете установить такое свойство для постоянной единицы.

И вы можете использовать EntityManager.clear(), если область действия этого сценария ограничена (чтобы не завершать очистку сеанса при каждом запросе)

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