gpt4 book ai didi

java - Spring Data JPA 删除不是我所期望的

转载 作者:行者123 更新时间:2023-11-30 02:41:37 26 4
gpt4 key购买 nike

我认为直到最近我对 Spring Data JPA(删除)有了更好的理解。

无论如何,我有两个具有 OneToManyManyToOne 关系的类:

@Entity
@Table(name = "COMPANIES")
public class Company implements Serializable {
...
@OneToMany(mappedBy = "company",
fetch = FetchType.EAGER,
orphanRemoval = true,
cascade = CascadeType.ALL)
private Set<Commodity> commodities = new HashSet<>();
}

....

@Entity
@Table(name = "COMMODITIES")
public class Commodity implements Serializable {
...
@ManyToOne(optional = false)
@JoinColumn(name = "COMPANY_ID", referencedColumnName = "ID", nullable = false)
private Company company;
}

我想删除 Commodity 记录,以便我的服务层中有此记录:

@Transactional
public void delete(Commodity commodity) {
repo.delete(commodity);
}

当我运行代码时,它执行所有 SELECT,但实际上从未执行删除。没有错误消息...日志中没有删除等。

所以我发现我有两个选择:

1) 删除 CascadeType.ALL

2)将我的删除方法更改为:

@Transactional
public void delete(Commodity commodity) {
Company company = commodity.getCompany();
company.getCommodities().remove(commodity);
companyRepo.save(company);
}

3)编写自定义@Query方法来执行删除(而不是不执行)。

我对级联的理解是,如果我们要删除像Company这样的主记录,那么它的所有子对象都会被自动删除。这对我来说很有意义。

所以,我的问题是,为什么 CascadeType 会阻止我手动删除子记录?

谢谢

编辑

我不是很清楚。使用上面的选项 1 或选项 2 确实会执行删除。

最佳答案

这是设计使然。

当您尝试单独删除商品时,拥有实体仍然具有商品实例应仍存在于数据库中的记录。

这是 hibernate doc 的准确引用:

Conversely, if an entity is removed from a collection (a one-to-many or many-to-many association), it will not be deleted by default. This behavior is completely consistent; a change to the internal state of another entity should not cause the associated entity to vanish. Likewise, adding an entity to a collection does not cause that entity to become persistent, by default.

关于java - Spring Data JPA 删除不是我所期望的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41490488/

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