diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetApplicationService.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetApplicationService.java index 7b7c0b4..cd33c11 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetApplicationService.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/application/DatasetApplicationService.java @@ -1,5 +1,6 @@ package com.datamate.datamanagement.application; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.datamate.common.domain.utils.ChunksSaver; @@ -101,6 +102,10 @@ public class DatasetApplicationService { public Dataset updateDataset(String datasetId, UpdateDatasetRequest updateDatasetRequest) { Dataset dataset = datasetRepository.getById(datasetId); BusinessAssert.notNull(dataset, DataManagementErrorCode.DATASET_NOT_FOUND); + + // 保存原始的 parentDatasetId 值,用于比较是否发生了变化 + String originalParentDatasetId = dataset.getParentDatasetId(); + if (StringUtils.hasText(updateDatasetRequest.getName())) { dataset.setName(updateDatasetRequest.getName()); } @@ -117,10 +122,22 @@ public class DatasetApplicationService { // handleParentChange 内部通过 normalizeParentId 方法将空字符串和 null 都转换为 null // 这样既支持设置新的父数据集,也支持清除关联 handleParentChange(dataset, updateDatasetRequest.getParentDatasetId()); + + // 检查 parentDatasetId 是否发生了变化 + if (!Objects.equals(originalParentDatasetId, dataset.getParentDatasetId())) { + // 使用 LambdaUpdateWrapper 显式地更新 parentDatasetId 字段 + // 这样即使值为 null 也能被正确更新到数据库 + datasetRepository.update(null, new LambdaUpdateWrapper() + .eq(Dataset::getId, datasetId) + .set(Dataset::getParentDatasetId, dataset.getParentDatasetId())); + } + if (StringUtils.hasText(updateDatasetRequest.getDataSource())) { // 数据源id不为空,使用异步线程进行文件扫盘落库 processDataSourceAsync(dataset.getId(), updateDatasetRequest.getDataSource()); } + + // 更新其他字段(不包括 parentDatasetId,因为它已经在上面的代码中更新了) datasetRepository.updateById(dataset); return dataset; } diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/Dataset.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/Dataset.java index 603fa5b..cf5375f 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/Dataset.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/Dataset.java @@ -1,6 +1,5 @@ package com.datamate.datamanagement.domain.model.dataset; -import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; @@ -32,7 +31,6 @@ public class Dataset extends BaseEntity { /** * 父数据集ID */ - @TableField(updateStrategy = FieldStrategy.IGNORED) private String parentDatasetId; /** * 数据集类型