将一个Tree结构数据复制到另一个表中并保持树结构
使用栈内存防止大数据栈溢出
private TargetEntity saveNode(TreeNode node, Long parentId) {
TargetEntity entity = new TargetEntity(node, parentId);
return targetRepository.save(entity);
}
public void processTreeIteratively(TreeNode root) {
Stack<TreeNodeWithParentId> stack = new Stack<>();
TargetEntity savedRoot = saveNode(root, null);
if (root.getChildren() != null) {
stack.push(new TreeNodeWithParentId(root, savedRoot.getId()));
}
while (!stack.isEmpty()) {
TreeNodeWithParentId current = stack.pop();
TreeNode node = current.getNode();
Long parentId = current.getParentId();
for (TreeNode child : node.getChildren()) {
TargetEntity savedChild = saveNode(child, parentId);
if (child.getChildren() != null) {
stack.push(new TreeNodeWithParentId(child, savedChild.getId()));
}
}
}
}
private static class TreeNodeWithParentId {
private TreeNode node;
private Long parentId;
public TreeNodeWithParentId(TreeNode node, Long parentId) {
this.node = node;
this.parentId = parentId;
}
}