更新另一个相关实体后,我需要对实体执行更新。
我有两个实体:OrderEntity
和CustomerOrderEntity
,它们之间的比例为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
。 最佳答案
我认为这不适用于其他实体。 JPA规范指出以下内容:
通常,便携式应用程序的生命周期方法不应调用EntityManager或查询操作,访问其他实体实例或修改同一持久性上下文内的关系。生命周期回调方法可以修改在其上被调用的实体的非关系状态。