Java “@ManyToOne(cascade=CascadeType.ALL)”中发生了什么?它与SQL有什么关系?
我使用Hibernate作为ORM框架Java “@ManyToOne(cascade=CascadeType.ALL)”中发生了什么?它与SQL有什么关系?,java,sql,hibernate,Java,Sql,Hibernate,我使用Hibernate作为ORM框架 我有一个双向关系,在Java中实现为: @Entity @Table(name = "Parent") class Parent { ... @OneToMany(cascade = CascadeType.ALL, mappedBy="parent", orphanRemoval=true) private List<Child> c
我有一个双向关系,在Java中实现为:
@Entity
@Table(name = "Parent")
class Parent {
...
@OneToMany(cascade = CascadeType.ALL, mappedBy="parent", orphanRemoval=true)
private List<Child> child;
}
此外,关系数据库表“Child”具有以下外键规范
fk_child_parent FOREIGN_KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
问题1:使用cascade=CascadeType.All注释子类的外键是否是一种不好的做法?根据我目前的理解,我假设每当我删除一个子项时,我就会级联事务并同时删除父项
由于父级可能有多个子级,这将留下一些孤立子级,这些孤立子级将由于orphanRemoving=true
选项而被删除。这是正确的吗
问题2:在Java中,我已经使用@OneToMany(cascade=CascadeType.ALL,…)
指定了从父级到子级的级联操作。SQL行,或者至少是DELETE CASCADE上的部分,是多余的吗
反之亦然,如果我有SQL行。。。在指定外键的DELETE CASCADE上,我可以跳过@JoinColumn
或@ManytoOne
注释吗
如果这是一个无关紧要的问题,请原谅。我对数据库/ORM还不熟悉,试图把我的脑袋绕到概念上。使用CascadeType。所有就像使用所有CascadeType
值,即CascadeType.PERSIST、CascadeType.MERGE
等
每个CascadeType
都引用EntityManager
上的操作。如果启用了entityManager.persist(父项)
,则如果启用了CascadeType.persist
,则Hibernate将自动对列表中的每个元素执行entityManager.persist(子项)
。其他级联类型也是如此
fk_child_parent FOREIGN_KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE