我需要在另一个相关实体更新后对一个实体执行更新。
我有两个实体:OrderEntity
和 CustomerOrderEntity
,它们的关系是 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/