Объекты кэшируются в jpa по умолчанию?

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

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

17
задан Pascal Thivent 25 April 2010 в 20:29
поделиться

2 ответа

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

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

19
ответ дан 30 November 2019 в 12:19
поделиться

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

JPA 1.0 не определяет кэш L2 («общий кеш»), JPA 1.0 определяет только кэш L1 («транзакционный кеш»), но провайдеры JPA могут поддерживать общий объектный кеш, и большинство из них. Это случай TopLink Essentials, который поддерживает кэш L1 и L2 через JPA Extensions for Caching (для JVM).

Теперь, как объясняется в замечательной статье Понимание кеша TopLink Essentials (GlassFish JPA) :

  • Все EntityManager из одного и того же модуля сохранения состояния совместно используют кеш сеанса (так TopLink называет второй уровень кеш).
  • Кэш сеанса включен по умолчанию.
  • Если есть модификации / удаления сущностей в контексте постоянства, они синхронизируются с кешем сеанса после подтверждения транзакции, поэтому состояние кеша сеанса обновляется (или такой кеш не будет использоваться вообще) .

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

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

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

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

Обновление: ответ на комментарий OP

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

Что ж, если вы не создадите ссылку между сущностями на уровне Java, JPA не сможет создать ее в базе данных (JPA делает только то, что вы говорите ему делать). Итак, да , вам нужно создать ссылку, а в случае двунаправленной ассоциации вам даже нужно установить обе стороны ссылки (например, добавить сотрудника в коллекцию сотрудников в отделе и установить отдел сотрудника ).

12
ответ дан 30 November 2019 в 12:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: