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