我有两个这样的实体,
实体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
,这解决了这个错误,但它没有删除数据库中的任何内容。
我如何才能在这里达到预期的结果?
1条答案
按热度按时间ymdaylpp1#
问题是您在
addressList
中引用了一些被删除的Address示例。如果在保存Person
之前调试并设置断点,您将看到此列表包含已删除地址的ID。删除Address
不会导致它从另一个(Person
)对象中删除,只要它在删除之前已加载到内存中。我看到两种方法来解决这个问题:
1.在删除之后从JPA获取Person。
1.从列表中手动删除已删除的地址
由于您有一个传递给deleteAll的地址列表,我想您已经拥有了使用解决方案2所需的一切。在保存之前执行
person.addressList.removeAll(//list of addresses)
。这是假设您希望从DB中删除所有地址。如果要重新创建它们,可以删除列表中地址的ID。