У меня есть древовидная структура , которую я называю графом и использующий список смежности . Класс Graph имеет
@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 вместо ВСЕ, но это не помогло. Похоже, что hibernate удаляет Graph, когда старый startNode больше не указывает на него.
Как я могу убедиться, что мой график не удаляется и замена узла работает?