hibernate - 删除对象但将子对象保留为孤儿而不出现 "a foreign key constraint fails"错误?

标签 hibernate jpa foreign-keys cascade

我有一个用户。该用户有一个文档。该文档有多个条目。如果我删除一个文档,那么我想保留子条目,这些条目将成为孤儿条目,以用于调试目的。使用底部描述的类,当我删除文档时,出现外键错误:

Cannot delete or update a parent row: a foreign key constraint fails (relation.entry, CONSTRAINT FK4001852ED0B1AFE FOREIGN KEY (document_id) REFERENCES document (id))

我正在使用一个基于模型创建表的框架。使用 Cascade = CascadeType.REMOVE 可以使其工作,但我不想删除子项。我应该使用特殊的 CascadeType 吗?

用户

@Entity
public class User {
    public String name;

    @OneToOne(mappedBy = "user", cascade = CascadeType.ALL)
    public Document document;
}

文档

@Entity
public class Document {
    public String title;

    @OneToOne
    public User user;

    @OneToMany(mappedBy = "document")
    public List<Entry> entries;
}

条目

@Entity
public class Entry {
    public String data;

    @ManyToOne
    public Document document;
}

最佳答案

默认情况下,JPA 不会级联关系上的任何操作,例如 DocumentEntry 之间定义的 @ManyToOne 关系。由于映射中没有定义级联类型,级联删除很可能由数据库按照外键约束指定来执行。

我怀疑您收到的错误源于数据库。尝试更改在删除外键约束中的父级时在数据库中执行的级联操作。许多数据库允许您将外键设置为空。以下是 Oracle 的示例:

CONSTRAINT fk_column
     FOREIGN KEY (column1, column2, ... column_n)
     REFERENCES parent_table (column1, column2, ... column_n)
     ON DELETE SET NULL 

执行删除后,执行刷新以将持久性上下文与数据库重新对齐非常重要。

关于hibernate - 删除对象但将子对象保留为孤儿而不出现 "a foreign key constraint fails"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17694777/

相关文章:

foreign-keys - Teradata:如何从表中删除外键约束?

java - 持久性提供者密码困境

java - 使用 JndiObjectFactoryBean 在运行时设置动态模式

java - JPA - 如何对通用结构中的不同字段使用@OneToMany mappedBy 属性?

java - 停用组件,直到从 JComboBox 中选择一个元素

java - 如何配置 Spring Boot、Spring JPA、Spring Test 和 Hibernate 来创建、使用和删除给定的 PostgreSQL 架构?

unit-testing - 如何使用hibernate执行sql脚本文件?

java - 对带有删除标志的数据使用 HQL 的正确方法是什么

java - 并发事务的问题

delphi - ElevateDB 关系模型的注意事项