我有一个用户。该用户有一个文档。该文档有多个条目。如果我删除一个文档,那么我想保留子条目,这些条目将成为孤儿条目,以用于调试目的。使用底部描述的类,当我删除文档时,出现外键错误:
Cannot delete or update a parent row: a foreign key constraint fails (
relation
.entry
, CONSTRAINTFK4001852ED0B1AFE
FOREIGN KEY (document_id
) REFERENCESdocument
(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 不会级联关系上的任何操作,例如 Document
和 Entry
之间定义的 @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/