Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring数据中的另一个实体更新后更新实体?_Java_Hibernate_Jpa_Spring Data Jpa - Fatal编程技术网

Java 如何在Spring数据中的另一个实体更新后更新实体?

Java 如何在Spring数据中的另一个实体更新后更新实体?,java,hibernate,jpa,spring-data-jpa,Java,Hibernate,Jpa,Spring Data Jpa,在更新另一个相关实体后,我需要对该实体执行更新 我有两个实体:OrderEntity和CustomerOrderEntity,关系为1:N。 两者都有一个状态字段订单实体状态取决于所有子项的状态字段。因此,如果更新了一个CustomerOrderEntity,我需要重新计算OrderEntity的新状态并保存/更新它 我实现了一个侦听器: public class CustomerOrderEntityEnventHandler { private OrderService order

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

我有两个实体:
OrderEntity
CustomerOrderEntity
,关系为1:N。 两者都有一个
状态
字段<代码>订单实体状态取决于所有子项的状态字段。因此,如果更新了一个
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

我认为它对其他实体不起作用。JPA规范说明如下:

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


这也许不能回答你的问题,但以上正是聚合根被发明的原因。哦,很好的输入。你知道一个解决方法来达到我的要求吗?基本上,我需要在发布后“触发”一些服务,以保持两个状态同步。最好的选择是在同一个服务方法中调用这两个方法。另一个选项是数据库触发器。第三种选择是使用另一个实体管理器,但这应该是最后的选择。