我以前曾经问过这个,但仍然不知道发生了什么......
我已经读过关于在删除之前需要清除关系的实体,以及关于父实体中的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);
}
进入循环z列表大小是314,并且有我期望的所有实体。然后我尝试将setOwner设置为null,因为这是与父元素的唯一关系。
归零所有者后,x实体中的所有属性都是long,string或localDate类型,所以肯定不能与父元素建立任何关系吗?
父元素是一组包含发票元素列表的发票
@OneToMany(cascade=CascadeType.ALL, mappedBy = "owner", orphanRemoval = true)
@JsonManagedReference
private List<Invoice> invoices = new ArrayList<>();
java填充只运行invoiceRepo.delete(x);
x 314,但实际上什么都不做,SQL调试显示甚至没有尝试删除任何东西,注意在这里查询...
为什么会这样?为什么没有任何疑问,没有错误,没有任何错误。
当你setOwner
并且不保存x时,它没有任何效果。此外,如果您有约束nullable=false
,则不能将其设置为null。
你想让我做什么?要删除发票并保留所有者吗?然后你应该删除orphanRemoval = true
。
或者,如果您要删除孤儿,请保持原样,只需删除发票而不将所有者设置为null。它会自动删除孤立的所有者。
如果要手动管理它们,请不要设置外键并断开它们之间的关系,只需删除任何记录,并将字段设置为null或value。
此外,您还可以使用存储库的delete(Iterable iterable)
方法一次删除多个。