【问题标题】:Hibernate orphanRemoval removes my parent entityHibernate orphanRemoval 删除我的父实体
【发布时间】:2020-02-07 11:32:48
【问题描述】:

我有一个树形结构,我称之为图表,它使用adjacency listGraph 类有

@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。

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

【问题讨论】:

    标签: java hibernate jpa one-to-many


    【解决方案1】:

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

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

    @Entity
    @Table(name = "Employee")
    public class Employee
    {
        @Id
        private Integer employeeId;
    
        @OneToMany(orphanRemoval = true, mappedBy = "employee")
        private Set<Account> accounts;
    }
    

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

    【讨论】:

    • 在你的情况下是的,但是我的例子有点不同,因为另一个节点将引用这个图。
    猜你喜欢
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多