java - 如何在 Spring Data 中的另一个实体更新后更新实体?

标签 java hibernate jpa spring-data-jpa

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

我有两个实体:OrderEntityCustomerOrderEntity,它们的关系是 1:N。 两者都有一个 status 字段。 OrderEntity 状态取决于所有 child 的状态字段。因此,如果更新了一个 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 中被注释,并且被正确调用。但是,在该过程完成后,即使调用 orderRepository.save() 并使用正确的新状态,OrderEntity 仍保持旧状态。

我希望 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

最佳答案

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

In general, the lifecycle method of a portable application should not invoke EntityManager or query operations, access other entity instances, or modify relationships within the same persistence context. A lifecycle callback method may modify the non-relationship state of the entity on which it is invoked.

关于java - 如何在 Spring Data 中的另一个实体更新后更新实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57842728/

相关文章:

java - 如何使用条件在 Hibernate 中实现选择和计数

java - Springboot 测试与 commandLineRunner 给出不同的结果

java - Hibernate 4 映射对象的组合

java - New Relic 监控 Websockets 应用程序详细信息

java - JTable 第一次执行时不显示结果

hibernate - 使用没有关系的 Hibernate/JPA 并避免多次数据库调用

java - hibernate , Spring 。同一实体的多个表示正在合并

java - Weblogic11g - java.lang.NoSuchMethodError : javax. persistence.OneToOne.orphanRemoval()z

java - Android MediaPlayer 创建失败

Java Selenium Webdriver chrome找不到元素