Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring数据JPA删除不是我所期望的_Java_Hibernate_Jpa_Spring Data Jpa_Cascading Deletes - Fatal编程技术网

Java Spring数据JPA删除不是我所期望的

Java Spring数据JPA删除不是我所期望的,java,hibernate,jpa,spring-data-jpa,cascading-deletes,Java,Hibernate,Jpa,Spring Data Jpa,Cascading Deletes,直到最近,我还以为我对Spring数据JPA(删除)有了更好的理解 总之,我有两个类,分别是OneToMany和manytone关系: @Entity @Table(name = "COMPANIES") public class Company implements Serializable { ... @OneToMany(mappedBy = "company", fetch = FetchType.EAGER,

直到最近,我还以为我对Spring数据JPA(删除)有了更好的理解

总之,我有两个类,分别是
OneToMany
manytone
关系:

@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;
}
当我运行代码时,它执行所有的SELECT操作,但它从来没有实际执行delete操作。没有错误消息…日志中没有删除等

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

1) 移除级联类型。全部

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

@Transactional
public void delete(Commodity commodity) {
    Company company = commodity.getCompany();
    company.getCommodities().remove(commodity);
    companyRepo.save(company);
}
3) 编写一个自定义@Query方法来执行delete(而不是)

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

所以,我的问题是,为什么级联类型阻止我手动删除子记录

谢谢

编辑


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

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

否则,看看,;希望能有帮助。 更多信息:

这是设计的

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

下面是hibernate的确切引用:

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


尽管行为可能已从抛出异常变为不执行任何操作,但请参见以下内容。最受欢迎的答案是您的解决方案(2),这是一个更好的解决方案,因为您要确保内存中的模型与数据库保持一致,而与原始解决方案不同。不,允许删除。这是我用艰难的方式发现的。幸运的是,我没有在这上面花太多时间。:-)
@Transactional
public void delete(Commodity commodity) {
    Company company = commodity.getCompany();
    company.getCommodities().remove(commodity);
    companyRepo.save(company);
}