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

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

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

dldeef67

dldeef671#

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

相关问题