Я добавляю объект к своей базе данных, и это хорошо работает. Но когда я получаю Список, я получаю старый объект, новые объекты, которые я добавляю, не показывают, пока я не неразвертываю приложение и повторно развертываю его снова. Это означает, что мои объекты кэшируются по умолчанию? Но, я не установил настроек для кэширования объектов в моем persistence.xml или любом таком файле.
Я даже попытался назвать сброс (), обновление () и слияние (). Но тем не менее это показывает старые объекты только. Я пропускаю что-то?Пожалуйста, помогите мне.
Добро пожаловать в JPA. Если вы его используете, это означает, что у вас будут огромные проблемы, если вы обновите базу данных за пределами JPA, если вы не знаете, что делаете, и не будете очень осторожны. Это означает, что вам нужно выяснить, как очистить кешированные объекты, чтобы их можно было перезагрузить.
По сути, не обновляйте сущности за пределами JPA, если вы вообще можете помочь, и если вы это сделаете, вам, вероятно, придется вникнуть в работу модели кэширования, используемой вашим конкретным провайдером JPA. Если вам нужно много обновлять за пределами JPA, то JPA, вероятно, вам не подходит.
Это означает, что мои объекты кэшируются по умолчанию?
JPA 1.0 не определяет кэш L2 («общий кеш»), JPA 1.0 определяет только кэш L1 («транзакционный кеш»), но провайдеры JPA могут поддерживать общий объектный кеш, и большинство из них. Это случай TopLink Essentials, который поддерживает кэш L1 и L2 через JPA Extensions for Caching (для JVM).
Теперь, как объясняется в замечательной статье Понимание кеша TopLink Essentials (GlassFish JPA) :
Значит, с вашей настройкой должно быть что-то еще не так. Вы можете попробовать отключить общий кеш сеанса для целей тестирования (и только для целей тестирования), добавив следующее свойство:
<property name="toplink.cache.shared.default" value="false"/>
Но я был бы удивлен, если это что-то изменит. Как я уже сказал, я думаю, что где-то есть еще одна проблема.
PS: Это не отвечает на вопрос, но, если вы используете GlassFish v3, почему бы вам не использовать EclipseLink?
Обновление: ответ на комментарий OP
Итак, если я сохраню запись о сотруднике, тогда он отображается в базе данных, но не в коллекции сотрудников в отделе, пока я явно не добавлю его в коллекцию сотрудников. Это необходимый шаг?
Что ж, если вы не создадите ссылку между сущностями на уровне Java, JPA не сможет создать ее в базе данных (JPA делает только то, что вы говорите ему делать). Итак, да , вам нужно создать ссылку, а в случае двунаправленной ассоциации вам даже нужно установить обе стороны ссылки (например, добавить сотрудника
в коллекцию сотрудников в отделе
и установить отдел
сотрудника
).