擁有 parent_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 一次寫入
CREATE TABLE audit (
audit_id BIGINT PRIMARY KEY,
parent_id BIGINT REFERENCES audit(audit_id),
name VARCHAR(100),
-- 其他業務欄位
);