【发布时间】:2017-01-05 16:54:45
【问题描述】:
我认为直到最近我对 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 方法来执行删除(而不是)。
我对级联的理解是,如果我们要删除像 Company 这样的主记录,那么它的所有子对象都会被自动删除。这对我来说很有意义。
那么,我的问题是,为什么 CascadeType 会阻止我手动删除子记录?
谢谢
编辑
我不是很清楚。使用上面的选项 1 或选项 2 会执行删除。
【问题讨论】:
-
尽管看起来行为可能已经从抛出异常变为什么都不做,但请参见以下内容。最受好评的答案是您的解决方案 (2),这是一个更好的解决方案,无论您确保内存中的模型与数据库保持一致,而原始解决方案并非如此。 stackoverflow.com/questions/11649249/…
标签: java hibernate jpa spring-data-jpa cascading-deletes