Сущности кэшируются в jpa по умолчанию?

Я добавляю объект в свою базу данных, и он работает нормально. Но когда я получаю список, я получаю старый объект, новые объекты, которые я добавляю, не отображаются, пока я не разверну приложение и не разверну его снова. Это означает, что мои сущности кэшируются по умолчанию? Но я не сделал никаких настроек для кэширования объектов в моей настойчивости.XML или любой такой файл.

Я даже пытался вызвать flush (), refresh () и merge (). Но все же он показывает только старые сущности. Я что-то упускаю? Пожалуйста помочь мне.

5 ответов


Добро пожаловать в JPA. Если вы используете его, это означает, что у вас будут огромные проблемы, если вы обновите базу данных за пределами JPA, если вы не знаете, что делаете, и очень осторожны. Это означает, что вы должны выяснить, как очистить любые кэшированные объекты, чтобы их можно было перезагрузить.

в принципе, не обновляйте объекты вне JPA, если вы можете вообще помочь ему, и если вы это сделаете, вам, вероятно, придется войти в работу модели кэширования, используемой вашим конкретным поставщиком JPA. Если вам нужно обновить за пределами JPA много, то JPA, вероятно, не является правильным выбором для вас.


это означает, что мои сущности кэшируются по умолчанию?

JPA 1.0 не определяет кэш-памяти L2 ("общий кэш"), JPA 1.0 определяет только Л1 кэша ("транзакционный кэш"), но поставщики JPA могут поддерживать общий кэш объектов, и большинство из них. Это случай Toplink Essentials, который поддерживает кэш L1 и L2 через расширения JPA для кэширования (на JVM).

теперь, как объясняется в большой статье понимание кэша Toplink Essentials (GlassFish JPA):

  • все EntityManagers из той же единицы персистентности совместно используют кэш сеанса (так TopLink вызывает кэш 2-го уровня).
  • кэш сеанса включен по умолчанию.
  • если есть изменения / удаления сущностей в контексте персистентности, они синхронизируются с кэшем сеанса после фиксации транзакции, поэтому состояние сеанса кэш обновляется!--11--> (или такой кэш вообще не будет использоваться).

таким образом, должно быть что-то еще не так с вашей настройкой. Ты можешь!--10-->попробовать отключите общий кэш сеанса для целей тестирования (и только для целей тестирования), добавив следующее свойство:

<property name="toplink.cache.shared.default" value="false"/>

но я был бы удивлен, если бы это что-нибудь изменило. Как я уже сказал,Есть еще одна проблема.

PS: Это не отвечает на вопрос, но, если вы используете GlassFish v3, почему бы вам не использовать EclipseLink?

Update: ответ на комментарий OP

поэтому, если я сохраняю запись сотрудника, то она отображается в базе данных, но не в коллекции сотрудников в отделе, пока я явно не добавлю ее в коллекцию сотрудников. Это необходимый шаг?

Ну, если вы не создать ссылке между сущностями на уровне Java JPA не сможет создать его в базе данных (СПД делает только то, что вы говорите ему делать). Итак,да, вам нужно создать ссылку и, в случае двунаправленной ассоциации, вам даже нужно установить обе стороны ссылки (например, добавить employee к коллекции сотрудников на Department и выберите department на Employee).


JPA 2.0 определяет общий кэш (L2), но не указывает значение по умолчанию. EclipseLink включает кэширование по умолчанию, другие поставщики-нет.

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

вы можете отключить общий кэш,

смотрите, http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching

но ваша проблема в том, что вы не поддерживайте отношения с обеих сторон. Когда вы устанавливаете 1-1, вам нужно добавить в 1-m, иначе ваши объекты недействительны.

для получения дополнительной информации о кэшировании см.,

http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching


вы используете EntityManager? если не дать ему попробовать http://docs.oracle.com/javaee/5/api/javax/persistence/EntityManager.html

вы используете источник данных для управления подключениями к базе данных? тебе тоже стоит попробовать. Это xml, настроенный на вашем сервере. Дайте больше информации о вашей архитектуре, чтобы мы могли вам помочь.


Я использую контекст eclipselink и ejb, я обнаружил, что когда я запрашиваю сущности, он будет автоматически кэшироваться, но я также запускаю функцию для изменения записи в базе данных, поэтому я могу получить старые данные в кэше, поэтому я отключаю кэш, добавив следующее в файл persistence.xml:

<shared-cache-mode>NONE</shared-cache-mode>

это не работает!