У меня есть следующее отображение собственной таблицы:
public class Node implements {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
...
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "IDFATHER", referencedColumnName = "ID")
private Node father;
@OneToMany(mappedBy = "father", fetch = FetchType.EAGER)
@Fetch(FetchMode.JOIN)
@Cascade(value =
{
CascadeType.ALL,
CascadeType.DELETE_ORPHAN
})
private List<Node> children;
По сути, это классическое дерево родительского / дочернего узла, использующее ту же таблицу, причем столбец IDFATHER указывает на идентификатор родительского узла.
Я реализовал некоторые базовые операции с деревом:
- Массовое удаление: удалить выбранный узел + все его дочерние элементы
- Одиночное удаление: удалить только выбранный узел, повторно-прикрепить все его потомки к его родителю
- ect ...
Для выполнения операции 2) Одиночное удаление:
// father of the node to be deleted
Node father = deletedNode.getFather();
if (deletedNode.getChildCount() != 0)
{
List<eNode> tempChildren = new ArrayList<Node>();
// put all children of deleted node in a temp list because the
// new FOR loop doesn't allow concurrent modification while looping
for (Node child : deletedNode.getChildren())
{
tempChildren.add(child);
}
for (Node child : tempChildren)
{
// re-attach first all the children to the father
father.getChildren().add(child);
child.setFather(father);
// remove all the children from the deleted node list
deletedNode.getChildren().remove(child);
// remove the deleted node from the father children' list
father.getChildren().remove(deletedNode);
}
}
this.nodeDAO.flush();
Я получил исключение
javax.persistence.EntityNotFoundException: удаленная сущность передана для сохранения
Насколько я понимаю, согласно официальной документации, когда вы удаляете сущность с Cascade.ALL
,удаление каскадно к его дочерним элементам.Однако в этом конкретном случае все дети повторно присоединяются к отцу, поэтому их не следует удалять ...
Когда я удаляю Cascade.DELETE_ORPHAN
, это работает.По логике вещей, повторно привязав детей к отцу, они больше не являются сиротами, поэтому Cascade.DELETE_ORPHAN
не должно иметь большого значения.
Есть какие-нибудь подсказки по этому вопросу?