我认为直到最近我对Spring Data JPA(删除)有了更好的理解。
无论如何,我有两个有OneToMany
和ManyToOne
关系的课程:
@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方法来执行删除(而不是)。
我对级联的理解是,如果我们要删除像公司这样的主记录,那么它的所有子对象都会被自动删除。这对我来说很有意义。
所以,我的问题是,为什么CascadeType阻止我手动删除子记录?
由于
修改
我不是很清楚。使用上面的选项1或选项2执行删除。
答案 0 :(得分:2)
这是设计的。
当您尝试自行删除商品时,拥有实体仍然记录数据库中仍应存在商品实例。
以下是来自hibernate doc的确切引用:
相反,如果从集合中删除实体(一对多 或多对多关联),默认情况下不会删除。这个 行为完全一致;改变内部状态 另一个实体不应该导致相关实体消失。 同样,将实体添加到集合不会导致该实体 默认情况下变得持久。
答案 1 :(得分:0)
您的数据库可能阻止您删除记录。 检查您的表定义,看看您有哪种约束,或者尝试直接在SQL控制台中删除一些记录,看看是否有任何错误。
否则,请查看question 306144;希望能帮助到你。 更多信息:here