【问题标题】:Hibernate delete just won't fire休眠删除只是不会触发
【发布时间】:2019-02-18 08:43:29
【问题描述】:

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

我读过关于删除前需要清除关系的实体,以及父实体中的 cascade.all,但是我仍然不明白休眠是如何不做任何事情的......

@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 调试显示甚至没有尝试删除任何东西,注意这里查询...

为什么会这样?为什么没有任何查询,没有错误,什么都没有。

【问题讨论】:

    标签: java hibernate repository jpa-2.0


    【解决方案1】:

    当你setOwner 并且不保存 x 时,它没有任何效果。另外,如果你有一个约束nullable=false,你不能将它设置为null。

    你想做什么?是否要删除发票并保留所有者?然后你应该删除orphanRemoval = true

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 2014-06-07
      • 2021-11-01
      • 1970-01-01
      • 2013-05-25
      • 2011-02-16
      相关资源
      最近更新 更多