Spring Data JPA删除不是我的预期

时间:2017-01-05 16:54:46

标签: java hibernate jpa spring-data-jpa cascading-deletes

我认为直到最近我对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方法来执行删除(而不是)。

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

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

由于

修改

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

2 个答案:

答案 0 :(得分:2)

这是设计的。

当您尝试自行删除商品时,拥有实体仍然记录数据库中仍应存在商品实例。

以下是来自hibernate doc的确切引用:

  

相反,如果从集合中删除实体(一对多   或多对多关联),默认情况下不会删除。这个   行为完全一致;改变内部状态   另一个实体不应该导致相关实体消失。   同样,将实体添加到集合不会导致该实体   默认情况下变得持久。

答案 1 :(得分:0)

您的数据库可能阻止您删除记录。 检查您的表定义,看看您有哪种约束,或者尝试直接在SQL控制台中删除一些记录,看看是否有任何错误。

否则,请查看question 306144;希望能帮助到你。 更多信息:here