Spring Data中另一个实体更新后如何更新一个实体?

时间:2019-09-08 14:16:57

标签: java hibernate jpa spring-data-jpa

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

我有两个实体: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

1 个答案:

答案 0 :(得分:4)

我认为它不适用于其他实体。 JPA规范指出:

  

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