首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

遞歸複製父子關係資料至資料庫:完整 Java 實作

     編輯:程式設計疑難解答

場景

擁有 parent_id 自關聯的樹狀資料(如選單、組織架構),需整棵子樹複製為新節點,並維持層級關係。

核心演算法:深度優先遞歸 + ID 映射


public void copySubTree(Map params, String newParentId) {
    // 1. 查詢當前層級所有子節點
    List children = auditDao.getVersionAudit(params);
    
    for (Audit child : children) {
        String oldId = child.getAuditId();      // 記住舊 ID
        child.setParentId(newParentId);         // 掛到新父節點
        String newId = auditDao.insertAudit(child); // 寫入 DB 取得新 ID
        
        // 2. 遞歸處理子節點,傳入新 ID 作為下一層父節點
        params.put("parentId", oldId);
        copySubTree(params, newId);
    }
}

關鍵細節

步驟說明
查詢條件隔離每層遞歸前更新 params["parentId"] 為「舊 ID」,確保只抓直系子代
新 ID 回傳insertAudit 需回傳資料庫自增/序列產生的新主鍵
事務控管建議在 Service 層加 @Transactional,確保全複製成功或全滾回
避免無限遞歸資料本身若有循環引用需額外加 visitedSet 判斷

效能優化建議

  • ✅ 批次插入:收集整棵樹的新物件清單,最後 batchInsert 一次寫入
  • ✅ 非遞歸寫法:使用堆疊/佇列迭代,避免深層樹導致 StackOverflow
  • ✅ 分頁查詢:單層子節點過多時分頁讀取,減少記憶體壓力

資料表結構範例


CREATE TABLE audit (
    audit_id   BIGINT PRIMARY KEY,
    parent_id  BIGINT REFERENCES audit(audit_id),
    name       VARCHAR(100),
    -- 其他業務欄位
);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved