【问题标题】:Spring Data JPA deletions not what I expectedSpring Data JPA 删除不是我所期望的
【发布时间】:2017-01-05 16:54:45
【问题描述】:

我认为直到最近我对 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 会执行删除。

【问题讨论】:

  • 尽管看起来行为可能已经从抛出异常变为什么都不做,但请参见以下内容。最受好评的答案是您的解决方案 (2),这是一个更好的解决方案,无论您确保内存中的模型与数据库保持一致,而原始解决方案并非如此。 stackoverflow.com/questions/11649249/…

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


【解决方案1】:

这是设计使然。

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

这是来自休眠 doc 的确切引用:

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

【讨论】:

  • 这是我发现的困难方式。幸运的是,我没有花太多时间在这上面。 :-)
【解决方案2】:

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

要不然看question 306144;希望能帮助到你。 更多信息:here

【讨论】:

  • 不,允许删除。
猜你喜欢
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 2017-06-05
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多