【问题标题】:How to remove parent entity without removing child?如何在不删除子实体的情况下删除父实体?
【发布时间】:2021-04-04 02:17:41
【问题描述】:

我有两个实体。

@Entity
class Parent(){
    @Id
    private UUID id;
    
    private String someValue;
    
    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "child_id", referencedColumnName = "id")
    private Child child;
}

@Entity
class Child(){
    @Id
    private UUID id;
    
    private String someVariable;
    
    private Integer someValue;
}

当我删除父实体时 - 子实体会自动删除。 如何在不删除子项的情况下删除父项?

【问题讨论】:

  • 不要级联所有,至少排除 REMOVE。此处的情况并非如此,因为此注释默认为 false,但请查看 @OneToOne 的 orphanRemoval 属性。
  • @KenS 默认情况下,orphanRemoval 值为“false”。但是当我尝试删除paren实体时 - 子实体也被删除
  • 重点是第一句话。请参阅 Harry_T 的答案。关于 orphanRemoval 的部分只是一个旁注,因为这可能是其他映射的问题,实际上默认情况下它是“true”。

标签: java spring-boot hibernate spring-mvc spring-data-jpa


【解决方案1】:

问题是级联,在你的代码中,是@OneToOne(cascade = CascadeType.ALL),这意味着下面的所有操作都会级联。

你可以试试这个,cascade=CascadeType.PERSIST 只有当您持久化实体时才会级联,如果您愿意,也可以使用其他类型:MERGE, REFRESH, REMOVE, DETACH

更多官方信息,请参考https://docs.jboss.org/hibernate/orm/4.3/javadocs/org/hibernate/metamodel/binding/CascadeType.html

【讨论】:

  • 当我使用cascade=CascadeType.PERSIST 时,休眠尝试在数据库中查找子实体而不是创建它,并在cascade=CascadeType.PERSIST 时抛出EntityNotFoundException
  • EntityNotFound 出现在很多情况下,比如 optional="false",或者合并一个 PARENT 实体但没有对 CHILD 实体进行级联合并操作。请提供更多信息,如错误堆栈跟踪和调用代码块,以便更好地解决问题。
【解决方案2】:

有很多CascadeType(PERSIST、MERGE、REMOVE、REFRESH,...)。注释行@OneToOne(cascade = CascadeType.ALL) 假设您正在组合所有的 cascadeType。 CascadeType.REMOVE 将在删除时删除当前行的所有相关子项。为避免这种情况,只需将您的级联类型更改为关注@OneToOne(cascade = {CascadeType.PERSIST, CascadeType.REFRESH})

【讨论】:

    猜你喜欢
    • 2019-10-02
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多