Доступ к объектам JPA в транзакции REST - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть конечная точка REST java, где я хотел бы получить доступ к сущностям JPA, сохраненным или обновленным с других конечных точек REST, но у меня возникают трудности с транзакционной природой JTA EntityManager.

Например, рассмотрим конечные точки, которые выполняют следующие действия на MyObject:

  1. Endpoint1 - создает экземпляр mo из MyObject с заполнением некоторых его полей и вызовамиem.persist(mo);
  2. Конечная точка2 - конечная точка обратного вызова, ожидающая ввода от третьей стороны, которая использует em.find(id) для получения mo, а затем обновляет mo.status.
  3. Конечная точка3 - em.find(id) получениеmo и затем выполняет бизнес-логику, основанную на всех заполненных в настоящее время полях.

Эти три конечные точки работают нормально, когда находятся в изоляции, как они спроектированы.Однако существует сценарий, в котором требуется изменить одно поле на mo, а затем выполнить все 3 конечных точки подряд на новом экземпляре mo2.Сначала я попытался создать четвертую конечную точку, которая бы использовала измененное поле, а затем внутренне вызвал методы конечной точки (без перехода по http), но столкнулся с проблемой транзакции, где метод для конечной точки 2 встречает нулевое значение mo2, потому что он не может видетьэтот метод endpoint1 создал его и соответственно обновил базу данных.

em.flush() здесь не помогает, а em.getTransaction().commit() возвращает

java.lang.IllegalStateException: JTA EntityManager не может использовать getTransaction()

Я в недоумении относительно того, что здесь лучше всего делать, мне кажется, что передо мной есть два варианта:

  1. Пусть клиентский код просто перезвонит 3 конечным точкам отдельнопосле настройки конечной точки4 внести необходимые изменения.(Достаточно просто и определенно сработает, но, похоже, это расточительно, так как я точно знаю, что нужно сделать на этом этапе, и мог бы просто инициировать вызовы со стороны сервера.)
  2. Есть другая практика или функцияJPA, который позволит мне делать все эти вызовы со стороны сервера соответственно.

Любая помощь или понимание здесь будет оценено, спасибо!

Настройка: Wildfly Server 12, Postgresql9.5.14, Ubuntu 18.04

...