Play Framework - EntityManager не найден в контексте

Привет, я получаю исключение при выполнении операций с БД.

java.lang.RuntimeException: EntityManager не найден в контексте. Попробуйте аннотировать свой метод действия с помощью @play.db.jpa.Transactional

Ниже приведен код

paymentResponse.onRedeem(response -> persistTransaction(response, buyerInformation.getCustomerId()));
paymentResponse.onRedeem(response -> completeProductOrder(response, buyerInformation));
paymentResponse.onRedeem(response -> postSuccessfulProcess(response, purchasePayload, buyerInformation));

persistTransaction и postSuccessfulProcess выполняют транзакции обновления БД, используя что-то вроде ниже

JPA.withTransaction(() -> {

и код для сохранения похож на

JPA.em().persist(entity);

withTransaction связывает EntityManager с карты с ключом «по умолчанию», но JPA.em() фактически ищет EntityManager с именем currentEntityManager. Я пытался использовать JPA.em («по умолчанию»), но это дает тайм-аут соединения.

Я новичок в игре framework. Не могли бы вы предложить мне какое-нибудь средство для решения этой проблемы.


person Sammy Pawar    schedule 17.10.2016    source источник
comment
Пожалуйста, посмотрите мой ответ на соответствующий вопрос. В частности, посмотрите на суть с простым полным примером gist.github.com/dzagorovsky/b8064c97ba647ed453ab   -  person dzagorovsky    schedule 17.10.2016


Ответы (1)


Начиная с Play 2.5 глобальный объект JPA устарел, и вместо него следует использовать JPAApi. JPAApi должен быть введен где-то раньше. Поскольку я вижу только небольшой фрагмент вашего кода, самый простой способ, который я могу предложить для его внедрения, выглядит следующим образом:

JPAApi jpa = Play.current().injector().instanceOf(JPAApi.class);

Теперь вы можете использовать его:

 jpa.withTransaction(() ->...

or

 jpa.em().persist(entity);

Конечно, предпочтительнее использовать аннотацию @Inject.

Вы можете узнать больше о различиях в использовании JPA, начиная с Play 2.5, в этой опубликовать.

person asch    schedule 17.10.2016
comment
Использование глобального состояния приложения, такого как Play.current(), не рекомендуется, лучше напрямую внедрить JPAApi. - person RP-; 18.10.2016
comment
@PR Вот почему упоминается, что предпочтительнее. - person asch; 18.10.2016
comment
Это зависит от того, нужен ли нам JPAApi в управляемом компоненте (Guice или другом), тогда мы можем напрямую внедрить его, в противном случае нам как-то нужно передать его при инициализации этого объекта (где нам нужно использовать jpaapi) или использовать static injection, который также не рекомендуется. В Play 2.5 предполагается, что все должно осуществляться через DI. - person RP-; 19.10.2016