"@ManyToOne(cascade=CascadeType.ALL)"中发生了什么?它与SQL有



我使用Hibernate作为ORM框架
我有一个双向关系,在Java中实现为:

@Entity
@Table(name = "Parent")
class Parent {
...

@OneToMany(cascade = CascadeType.ALL, mappedBy="parent", orphanRemoval=true)
private List<Child> child; 
}
@Entity
@Table(name = "Child")
class Child {
...

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "parent_id")
private Parent parent; 
}

此外,关系数据库表";"孩子";具有以下外键规范

fk_child_parent FOREIGN_KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE

问题1:cascade = CascadeType.All注释子类的外键是不是不好的做法?根据我目前的理解,我假设每当我删除子项时,我都会级联事务并删除父项
由于父级可能有多个子级,这将留下一些孤儿级,这些孤儿级将由于orphanRemoval=true选项而被删除。这是正确的吗?

问题2:在Java中,我已经用@OneToMany(cascade = CascadeType.ALL, ...)指定了从父级到子级的级联操作。SQL行,或者至少是它的ON DELETE CASCADE部分,是多余的吗
反之亦然,如果我有指定外键的SQL行... ON DELETE CASCADE,我可以跳过@JoinColumn@ManytoOne注释吗?

如果这是个琐碎的问题,请原谅。我是数据库/ORM的新手,正试图了解这些概念。

使用CascadeType.ALL类似于使用所有CascadeType值,即CascadeType.PERSIST, CascadeType.MERGE等。

每个CCD_ 11指的是对CCD_。如果执行entityManager.persist(parent),那么如果启用了CascadeType.PERSIST,Hibernate将自动为列表中的每个元素执行entityManager.persist(child)。其他级联类型也是如此。

最新更新