在`@manytone(cascade=cascadetype.all)`中发生了什么,它与sql有什么关系?

0kjbasz6  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(285)

我使用hibernate作为orm框架。
我有一个双向关系,在java中实现为:

  1. @Entity
  2. @Table(name = "Parent")
  3. class Parent {
  4. ...
  5. @OneToMany(cascade = CascadeType.ALL, mappedBy="parent", orphanRemoval=true)
  6. private List<Child> child;
  7. }
  1. @Entity
  2. @Table(name = "Child")
  3. class Child {
  4. ...
  5. @ManyToOne(cascade = CascadeType.ALL)
  6. @JoinColumn(name = "parent_id")
  7. private Parent parent;
  8. }

此外,关系数据库表“child”具有以下外键规范

  1. 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还不太熟悉,我正试着把我的头脑放在概念上。

dldeef67

dldeef671#

使用 CascadeType.ALL 就像使用所有的 CascadeType 价值观,即。 CascadeType.PERSIST, CascadeType.MERGE 等。
CascadeType 是指对 EntityManager . 如果你这样做了 entityManager.persist(parent) 然后休眠会自动完成 entityManager.persist(child) 对于列表中的每个元素,如果 CascadeType.PERSIST 已启用。其他级联类型也是如此。

相关问题