gpt4 book ai didi

java - Hibernate 删除不会触发

转载 作者:行者123 更新时间:2023-12-02 10:15:06 24 4
gpt4 key购买 nike

我以前问过这个问题,但仍然不知道发生了什么......

我读过有关在删除之前需要清除实体关系的信息,以及有关父实体中的cascade.all的信息,但是我仍然不明白hibernate如何不做任何事情...

@Transactional
public void deleteAllinRange(LocalDate a, LocalDate b) {
List<Invoice> z = invoiceRepo.selector(a,b);
for(Invoice x : z){
x.setOwner(null);
invoiceRepo.delete(x);
}

进入for循环z列表大小是314,并且有我期望的所有实体。然后我尝试将 setOwner 设置为 null,因为这是与父元素的唯一关系。

将所有者清空后,x 实体中的所有属性都是 long、string 或 localDate 类型,所以肯定不会与父元素有任何关系吗?

父元素是一组带有发票元素列表的发票

@OneToMany(cascade=CascadeType.ALL, mappedBy = "owner", orphanRemoval = true)
@JsonManagedReference
private List<Invoice> invoices = new ArrayList<>();

java fill 只需运行 invoiceRepo.delete(x); x 314,但实际上根本不会执行任何操作,并且 SQL 调试显示甚至没有尝试删除任何内容,请注意此处查询。 .

为什么会发生这种情况?为什么没有任何查询,没有错误,什么也没有。

最佳答案

当您setOwner并且不保存x时,它没有任何效果。另外,如果您有约束 nullable=false,则无法将其设置为 null。

你想做什么?您想删除发票并保留所有者身份吗?然后您应该删除orphanRemoval = true

否则,如果您想删除孤立的发票,请保持原样,只删除发票而不将所有者设置为空。它将自动删除孤立的所有者。

如果您想手动管理它们,请不要设置外键并破坏它们之间的关系,只需在需要时删除任何记录并自行将字段设置为 null 或值即可。

此外,您还可以使用存储库的方法delete(Iterable iterable)一次性删除多个。

关于java - Hibernate 删除不会触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54743311/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com