在REST事务中访问JPA实体

时间:2018-11-26 22:15:18

标签: java rest jpa jta

我有一个Java REST端点,我想在该端点上访问从其他REST端点保留或更新的JPA实体,但是我在JTA EntityManager的事务性质方面遇到困难。

例如,考虑在MyObject上完成以下任务的端点:

  1. 端点1-创建mo的实例MyObject,并填充其某些字段并调用em.persist(mo);
  2. Endpoint2 –一个回调端点,正在等待来自第三方的输入,该回调端点使用em.find(id)来检索mo,然后更新mo.status
  3. 端点3 – em.find(id)检索mo,然后根据当前填充的所有字段执行业务逻辑。

这三个端点在隔离时可以正常工作,这是它们的设计方式。但是,有一种情况需要在mo上更改一个字段,然后在新实例mo2上连续执行所有3个端点。我最初尝试创建第四个终结点,该终结点将使用更改后的字段,然后在内部调用终结点方法(不遍历http),但是遇到了事务问题,其中endpoint2的方法遇到空mo2,因为它可以看不到endpoint1方法已创建它并相应地更新了数据库。

em.flush()在这里无济于事,em.getTransaction().commit()返回

  

java.lang.IllegalStateException:JTA EntityManager无法使用getTransaction()

我对这里的最佳做法不知所措,在我看来,我面前有两个选择:

  1. 让客户端代码仅在调整endpoint4以进行必要的更改后分别分别调用这三个端点。 (足够简单,肯定会起作用,但是似乎有点浪费,因为我确切地知道此时需要完成什么,并且可以简单地从服务器端发起调用。)
  2. JPA的另一种实践或功能使我可以从服务器端进行所有这些调用。

在这里对您的任何帮助或见识将不胜感激!

设置: Wildfly Server 12,PostgreSQL 9.5.14,Ubuntu 18.04

0 个答案:

没有答案