当前位置: 首页 > 知识库问答 >
问题:

JPA@OneTomany中的级联删除与数据库级联外键删除

章安易
2023-03-14
@Entity
public class Parent {

    @Id
    private Long id;
    @OneToMany(cascade = {CascadeType.REMOVE})
    private List<Child> children;
    // getters, setters...

}

@Entity
public class Child {

    @Id
    private Long id;
    @ManyToOne(optional = false)
    @JoinColumn(name = parent_id, nullable = false)
    private Parent parent;
    // getters, setters...

}

在数据库中,子表将有一个列parent_id,并对父表id列具有外键约束。

对于在删除时级联的外键约束,可能执行的一些操作包括delete设置为nulldo nothing。这给出了以下方案组合。

       JPA | cascade | no cascade |
           | remove  | remove     |
DB FK      |         |            |
-----------+---------+------------|
delete     |    A    |     D      |
-----------+---------+------------|
set null   |    B    |     E      |
-----------+---------+------------|
do nothing |    C    |     F      |
-----------+---------+------------+
  • a:在JPA中对父级进行级联删除调用,在删除父行时删除数据库中的子级。
  • b:在JPA中级联删除,在父删除时将子表中的外键列设置为null。在这种情况下,@joincolumn中的nullable@manytoone中的optional可能需要为true/false。
  • C:在JPA中进行级联删除,在数据库中对外键删除不做任何操作。
  • D:在JPA中不级联删除,在数据库中级联删除父级。
  • E:在JPA中不要级联删除,在父删除时将子表中的外键列设置为null。
  • f:不要在JPA中级联删除,不要在数据库中执行外键删除操作。

关于这个的问题。

哪种情况会导致异常?如果图C会。如果通过EntityManager移除实例,则首先对该实例执行调用,然后级联到collection属性中的实例。但是,试图在不首先删除相关子级的情况下从数据库中删除父级会导致外键冲突。这是正确的吗?还有其他错误的场景吗?试图从持久性中删除已经从基础数据库中删除的实体是否会导致问题?

使EntityManager缓存处于与数据库不一致的状态?我认为是D和E,在这些情况下,您必须自己为子列表中的实例调用remove()

共有1个答案

皇甫琛
2023-03-14

我认为B和E也会导致异常,因为外键字段not是可空的。

当用null更新其值时,将引发异常。

    null
 类似资料:
  • 我读过一些相关的问题,但它们和我的问题不完全一样。 我使用的是JPA Hibernate Spring,我想做一些我不确定是否仅通过配置就可以做到的事情。 我的域类具有或多或少复杂的关系。有许多元素与一个元素相关(就像是一棵树,许多元素是一个元素的子元素)。 类似的东西: 这样会得到一张桌子: 当我删除id=1的行时,我希望删除id=2和id=3的行(这可能是递归的,parent_id=2并且pa

  • 问题内容: 我有两个像这样的表: 因此,逻辑很简单,用户删除了类别x下​​的所有书籍,从猫中删除了x之后,我尝试了上述方法,但不起作用,在我清理了表格书籍后,表格类别仍被填充,这是怎么回事? 问题答案: 具有级联删除功能的外键意味着,如果删除父表中的记录,则子表中的相应记录将被自动删除。这称为级联删除。 您说的是相反的意思,这不是当您从子表中删除时会将记录从父表中删除。 ON DELETE CAS

  • 主要内容:JPA级联删除示例,输出结果级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于执行级联删除操作 - JPA级联删除示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步: 在包下创建

  • 嗨,我遇到这样的情况: 带有2个字段的实体标记,其中包含2组对象(Obj1、Obj2)。删除Obj1时,我想删除标记实体中设置的Obj1中包含的所有信息。你能告诉我怎么做吗? 检查点中没有对标记的引用。若我将Cascade设置为ManyToMany,那个么当我删除标记时,所有带有该标记的用户都会被删除。我想要的是在删除检查点时删除tag\u检查点表中的行。我应该自己做还是有好办法??

  • 我使用的是Hibernate的JPA实现。我有一个包含不同类型用户(私有、公共等)的用户表,user_type列指定用户的类型。 我有一个User类,它是一个表示User表的实体。我补充说 在我的用户类上创建了两个类,PrivateUser和PublicUser,它们都用相应的@DiscriminatorValue扩展了用户类。 如果我的解释不清楚,请让我知道。 提前致谢

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下: