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或查询操作、访问其他实体实例或修改同一持久性上下文中的关系。生命周期回调方法可以修改调用它的实体的非关系状态
这也许不能回答你的问题,但以上正是聚合根被发明的原因。哦,很好的输入。你知道一个解决方法来达到我的要求吗?基本上,我需要在发布后“触发”一些服务,以保持两个状态同步。最好的选择是在同一个服务方法中调用这两个方法。另一个选项是数据库触发器。第三种选择是使用另一个实体管理器,但这应该是最后的选择。