我使用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;
}
此外,关系数据库表“child”具有以下外键规范
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还不太熟悉,我正试着把我的头脑放在概念上。
1条答案
按热度按时间dldeef671#
使用
CascadeType.ALL
就像使用所有的CascadeType
价值观,即。CascadeType.PERSIST, CascadeType.MERGE
等。每
CascadeType
是指对EntityManager
. 如果你这样做了entityManager.persist(parent)
然后休眠会自动完成entityManager.persist(child)
对于列表中的每个元素,如果CascadeType.PERSIST
已启用。其他级联类型也是如此。