Более широко используемый подход заключается в создании EntityManager
для запроса. Однако это должно оставаться скрытым от вас. Вы должны использовать какой-нибудь механизм внедрения зависимостей (spring / CDI / EJB), который будет вводить правильное EntityManager
, где находится @PersistenceContext
.
Если вас интересует, как это достигается в общем случае, когда ваши bean-компоненты являются некими синглетонами (один bean-компонент без состояния / один пружинный bean-компонент scope singleton) - контейнер фактически внедряет прокси в целевой объект. И каждый раз, когда с прокси обращаются, он получает экземпляр current EntityManager
, который (по крайней мере, в случае с пружиной) связан с ThreadLocal
(= запросом в этом случае)
Обновление: Если вы хотите реализовать эту функциональность в домашней инфраструктуре, используйте прокси-сервер cglib / javassist / JDK и вставьте ее туда, где находится @PersistenceContext
. Запрос = поток. Для каждого запроса, который требует доступа к данным, создайте новый EntityManager
и сохраните его в ThreadLocal
. Не забудьте очистить его в конце, потому что контейнеры сервлета повторно используют потоки. Из прокси вы можете получить текущее значение ThreadLocal
.
Но если вы не зашли в проект, я бы предложил перейти к чему-то более стабильному, например, к spring, cdi или guice.