当前位置: 首页 > 知识库问答 >
问题:

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

曹自怡
2023-03-14

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

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

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
}

共有1个答案

通骁
2023-03-14

我不认为这对其他实体行得通。JPA规范规定如下:

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

 类似资料:
  • 我想在构造函数外部或从另一个类更新已创建控件的JLabel。在这里,我创建了一个控件,并在构造函数中添加了一些组件。UI是在main中创建的,但是我想更新这个类之外的一些标签。所以我创建了setResult(最终字符串文本,最终字符串路径)来做这样的事情,但它不起作用。。。。 我的问题是setResult不起作用。我不知道为什么。有人能帮忙吗?谢谢

  • 这是我的php文件...我想在第二个表成功插入后更新第一个表,我要选择并正确插入,但我想更新的行在数据插入后没有更新。 有人能告诉我如何写这在PHP mysqli程序的方式。

  • 我正在使用齐柏林飞艇0.6.2和火花2.0。 我尝试在循环中执行查询,但效果不是很好。 我需要循环一个数据帧的每一行,大约5000行,并执行一个查询,这将在另一个数据帧中增加一个值。 以下是我的尝试: 我试着从两个数据帧中提取一小部分,但仍然很慢。我觉得我做得不对。 知道如何快速更新数据帧吗?

  • 因此,我看了关于使用Spring数据的JPA的各种教程,在许多情况下都有不同的做法,我不太确定正确的方法是什么。 假设存在follwing实体: 我们还有一个DTO,它在服务层中检索,然后交给控制器/客户端。 因此,现在假设客户想要在webui中更改他的名称--然后将会有一些控制器操作,其中将会有更新的DTO(使用旧ID和新名称)。 现在我必须将这个更新的DTO保存到数据库中。 不幸的是,目前没有

  • 我有一个User类,它有一些附加属性: 现在,如果我调用一些方法来改变其中一个房子(例如改变它的名称属性),如果我调用,我仍然会得到房子的旧值: 我如何确保它总是更新?

  • 我必须在我的android活动中实现2个回收器视图,其中第一个回收器视图显示类别,第二个将显示来自所选类别的项目。我已经实现了第一个回收器视图。 现在,在RecycerView中单击一个项目时,我需要突出显示该视图,还需要显示该类别下的项目。当我单击另一个视图时,第一个视图高亮应该更改为单击并显示该类别中的项目的新视图。另外,当我谈到这个活动时,第一个项目应该在第一个回收器视图中默认突出显示,相应