Spring Boot 如何在同一笔交易下进行删除和保存?

qxsslcnc  于 2023-05-17  发布在  Spring
关注(0)|答案(1)|浏览(178)

我有两个这样的实体,
实体Address

@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
@JsonBackReference
@EqaulsAndHashCode.Exclude
@ToString.Exclude
@JoinColumn(name="PERSON_ID", referencedColumns = "PERSON_ID")
private Person personDetails;

实体Person

@OneToMany(mappedBy = "personDetails", orphanRemoval = true, cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@ToString.Exclude
@EqualsAndHashCode.Exclude
@JsonManagedReference
List<Address> addressList = new ArrayList<>();

我在@Transactional方法中使用AddressRespository.deleteAll(//list of address)删除Address。然后,该方法从另一个服务调用另一个方法,该服务也使用@Transactional进行了注解,并更新了Person的一个属性,并执行了save操作。
在此阶段,它返回错误deleted instance passed to merge
我尝试在deleteAll之后使用flush,这解决了这个错误,但它没有删除数据库中的任何内容。
我如何才能在这里达到预期的结果?

ymdaylpp

ymdaylpp1#

问题是您在addressList中引用了一些被删除的Address示例。如果在保存Person之前调试并设置断点,您将看到此列表包含已删除地址的ID。删除Address不会导致它从另一个(Person)对象中删除,只要它在删除之前已加载到内存中。
我看到两种方法来解决这个问题:
1.在删除之后从JPA获取Person。
1.从列表中手动删除已删除的地址
由于您有一个传递给deleteAll的地址列表,我想您已经拥有了使用解决方案2所需的一切。在保存之前执行person.addressList.removeAll(//list of addresses)
这是假设您希望从DB中删除所有地址。如果要重新创建它们,可以删除列表中地址的ID。

相关问题