我正在为订单工作流系统编写e2e测试用例。更新订单上的付款清单时,我收到一个孤立的删除错误。但是,仅在运行测试时(针对H2),而不是在运行应用程序时(针对SQL Server),才会发生此异常。
我所有的表都是由Hibernate生成的。发生此错误时,订单的付款清单中已经存在一项。我试图将第二个付款项目添加到列表中。我不明白为什么在运行测试时会生成孤儿并导致此问题,但在应用程序的实际运行中却无法。
我在订单及其付款清单之间建立了@OneToMany
关系。从关系中删除orphanRemoval=true
属性可以消除错误,因为它不再尝试删除生成的孤立孤岛,并且付款清单已更新并正确保存并带有有效ID。但这不是真正的解决方案,因为我需要将orphanRemoval
设置为true。
在尝试保存新的付款项目时,我看到它已设置了正确的订单ID,付款ID为0(因为尚未保存)。付款清单中先前存在的商品也具有有效的付款ID和订单ID。
订单:
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
public Set<Payment> getPayments() {
return payments;
}
更新付款方式:
order.getPayments().add(payment);
order = orderRepository.saveAndFlush(order);
saveAndFlush异常:
org.springframework.orm.jpa.JpaSystemException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: Order.payments; nested exception is org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: Order.payments
由于这可以在针对SQL Server的应用程序的实际运行中工作,所以我无法理解为什么在针对H2数据库的测试中它失败。我试图避免更改订单付款关系,因为从技术上讲这已经在起作用。