java - 如何在 Spring Data 中的另一个实体更新后更新一个实体?
问题描述
在更新另一个相关实体后,我需要对实体执行更新。
我有两个实体:OrderEntity
和CustomerOrderEntity
,关系为 1:N。两者都有一个status
领域。OrderEntity
status 取决于所有孩子的 status 字段。所以,如果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 或查询操作、访问其他实体实例或修改同一持久性上下文中的关系。生命周期回调方法可以修改调用它的实体的非关系状态。
推荐阅读
- codeigniter-3 - 来自模块的视图不会显示 (CodeIgniter HMVC)
- python - python 正则表达式无法匹配,但在 javascript 中与相同的部分匹配
- vuejs2 - nuxtjs中的vuex模块模式
- css - 如果鼠标位于 div 的下半部分,CSS 会动态更改悬停时的可点击区域以调整大小
- python - 尝试从带有列表的熊猫系列中删除大量文本
- go-imagick - 我应该使用哪个函数来使用 Imagemagick magickwand 删除(剥离)图像的色彩空间
- kubernetes - The connection to the server localhost:8080 was refused - IBM Private Cloud 2.1.0.2 Installation
- angularjs - 设置 Angular 6 和 Angular 1.5.8
- c# - Task.Run() 在高负载下随机/不规则地安排任务
- linux - 如果 IP 相同,则合并两个 /etc/hosts 文件