【问题标题】:How to update an Entity after another Entity update in Spring Data?如何在 Spring Data 中的另一个实体更新后更新一个实体?
【发布时间】:2020-01-10 13:18:41
【问题描述】:

在另一个相关实体更新后,我需要对一个实体执行更新。

我有两个实体:OrderEntityCustomerOrderEntity,关系为 1:N。 两者都有一个status 字段。 OrderEntity 状态取决于所有孩子的状态字段。所以,如果有一个CustomerOrderEntity被更新,我需要重新计算OrderEntity的新状态并持久化/更新它。

我已经实现了一个监听器:

public class CustomerOrderEntityEnventHandler {

    private OrderService orderService;

    @PostUpdate
    public void handleAfterSave(CustomerOrderEntity customerOrder) {
        OrderEntity order = customerOrder.getOrder();
        OrderStatus newStatus = calculateNewStatus(order);
        order.setStatus(newStatus);
    }

        //other methods and DI handler for orderService. The injection is fine.
}

侦听器在CustomerOrderEntity 中进行了注释,并且被正确调用。但是,该过程完成后,OrderEntity 仍保持旧状态,即使以正确的新状态调用 orderRepository.save()

我希望 orderEntity 能够更新为新状态。

更新:
我将实现更改为使用PostUpdateEventListener。它正在被正确调用,但是,“其他”实体仍未更新。

public class CustomerOrderEntityUpdateEnventListener implements PostUpdateEventListener {
    @Override
    public void onPostUpdate(PostUpdateEvent event) {
        if (event.getEntity() instanceof CustomerOrderEntity) {

            Session session = event.getSession();
            CustomerOrderEntity customerOrder = (CustomerOrderEntity) event.getEntity();
            OrderEntity order = customerOrder.getOrder();
            OrderStatus newStatus = calculateNewStatus(order);
            order.setStatus(newStatus);

            session.saveOrUpdate(order);
        }
    }

//other methods
}

注意更新的实体是CustomerOrderEntity,我要更新OrderEntity

【问题讨论】:

  • 这可能无法回答您的问题,但以上正是发明聚合根的原因。

标签: java hibernate jpa spring-data-jpa


【解决方案1】:

我认为它不适用于其他实体。 JPA 规范说明如下:

一般来说,可移植应用程序的生命周期方法不应调用 EntityManager 或查询操作、访问其他实体实例或修改同一持久性上下文中的关系。生命周期回调方法可能会修改调用它的实体的非关系状态。

【讨论】:

  • 哦,不错的输入。您知道实现我的要求的解决方法吗?基本上我需要在发布后“触发”一些服务,以保持两个状态同步。
  • 最好的选择是在同一个服务方法中调用这两种方法。另一种选择是数据库触发器。第三种选择是使用另一个实体管理器,但它应该是最后的手段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 2013-02-19
  • 2017-05-10
相关资源
最近更新 更多