首页 > 解决方案 > 如何在 Spring Data 中的另一个实体更新后更新一个实体?

问题描述

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

我有两个实体:OrderEntityCustomerOrderEntity,关系为 1:N。两者都有一个status领域。OrderEntitystatus 取决于所有孩子的 status 字段。所以,如果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.

标签: javahibernatejpaspring-data-jpa

解决方案


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

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


推荐阅读