У меня есть конечная точка REST java, где я хотел бы получить доступ к сущностям JPA, сохраненным или обновленным с других конечных точек REST, но у меня возникают трудности с транзакционной природой JTA EntityManager
.
Например, рассмотрим конечные точки, которые выполняют следующие действия на MyObject
:
- Endpoint1 - создает экземпляр
mo
из MyObject
с заполнением некоторых его полей и вызовамиem.persist(mo)
; - Конечная точка2 - конечная точка обратного вызова, ожидающая ввода от третьей стороны, которая использует
em.find(id)
для получения mo
, а затем обновляет mo.status
. - Конечная точка3 -
em.find(id)
получениеmo
и затем выполняет бизнес-логику, основанную на всех заполненных в настоящее время полях.
Эти три конечные точки работают нормально, когда находятся в изоляции, как они спроектированы.Однако существует сценарий, в котором требуется изменить одно поле на mo
, а затем выполнить все 3 конечных точки подряд на новом экземпляре mo2
.Сначала я попытался создать четвертую конечную точку, которая бы использовала измененное поле, а затем внутренне вызвал методы конечной точки (без перехода по http), но столкнулся с проблемой транзакции, где метод для конечной точки 2 встречает нулевое значение mo2
, потому что он не может видетьэтот метод endpoint1 создал его и соответственно обновил базу данных.
em.flush()
здесь не помогает, а em.getTransaction().commit()
возвращает
java.lang.IllegalStateException: JTA EntityManager не может использовать getTransaction()
Я в недоумении относительно того, что здесь лучше всего делать, мне кажется, что передо мной есть два варианта:
- Пусть клиентский код просто перезвонит 3 конечным точкам отдельнопосле настройки конечной точки4 внести необходимые изменения.(Достаточно просто и определенно сработает, но, похоже, это расточительно, так как я точно знаю, что нужно сделать на этом этапе, и мог бы просто инициировать вызовы со стороны сервера.)
- Есть другая практика или функцияJPA, который позволит мне делать все эти вызовы со стороны сервера соответственно.
Любая помощь или понимание здесь будет оценено, спасибо!
Настройка: Wildfly Server 12, Postgresql9.5.14, Ubuntu 18.04