首页 > 解决方案 > Hibernate orphanRemoval 删除我的父实体

问题描述

我有一个树结构,我称之为图,它使用邻接列表。类

@OneToMany(mappedBy = "graphEntry", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@OptimisticLock(excluded = true)
public List<GraphNode> getStartNodes() {
    return startNodes;
}

public void addStartNode(GraphNode graphNode){
    startNodes.add(graphNode);
    graphNode.setGraphEntry(this);
}

public void removeStartNode(GraphNode graphNode){
    startNodes.remove(graphNode);
    graphNode.setGraphEntry(null);
}

GraphNode有:

@ManyToOne
@JoinColumn(name = "graphEntry")
public Graph getGraphEntry() {
    return graphEntry;
}

@ManyToOne(fetch = FetchType.LAZY, targetEntity = GraphNode.class)
@JoinColumn(name = "parent")
@OptimisticLock(excluded = true)
public GraphNode getParentNode() {
    return parentNode;
}

@OneToMany(mappedBy = "parentNode", cascade = CascadeType.ALL, orphanRemoval = true) 
@OptimisticLock(excluded = true)
public List<GraphNode> getChildNodes() {
    return childNodes;
}

当我用不同的节点替换 startNode 时,我得到

PersistentObjectException: detached entity passed to persist: ...GraphNode

当我更改 2 个节点的顺序时,我的数据已正确保存在数据库中。

我试图将级联类型更改为 PERSIST 和 MERGE 而不是 ALL 但它没有帮助。当旧的 startNode 不再指向那里时,看起来休眠正在删除 Graph。

如何确保我的图表没有被删除并且节点替换有效?

在此处输入图像描述

标签: javahibernatejpaone-to-many

解决方案


orphanRemoval当您设置为 true时,这是正确的行为;它告诉孩子是否是孤儿。它也应该从数据库中删除。

让我们通过一个示例来理解这一点,假设您有Employee实体,而 Employee 可以有多个帐户。

@Entity
@Table(name = "Employee")
public class Employee
{
    @Id
    private Integer employeeId;

    @OneToMany(orphanRemoval = true, mappedBy = "employee")
    private Set<Account> accounts;
}

这实质上意味着每当我们从帐户集中删除“帐户”(这意味着我正在删除该帐户与员工之间的关系);与数据库上任何其他员工(即孤儿)不相关的帐户实体也应该被删除。


推荐阅读