From 699031dae72dad7a31806512d30aace591f9d49f Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Tue, 3 Feb 2026 11:09:15 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=9B=86=E6=97=B6=E6=97=A0=E6=B3=95=E6=B8=85?= =?UTF-8?q?=E9=99=A4=E5=85=B3=E8=81=94=E6=95=B0=E6=8D=AE=E9=9B=86=E7=9A=84?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题分析: 之前尝试使用 @TableField(updateStrategy = FieldStrategy.IGNORED/ALWAYS) 注解 来强制更新 null 值,但 FieldStrategy.ALWAYS 可能不存在于当前 MyBatis-Plus 3.5.14 版本中,导致编译错误。 修复方案: 1. 移除 Dataset.java 中 parentDatasetId 字段的 @TableField(updateStrategy) 注解 2. 移除不需要的 import com.baomidou.mybatisplus.annotation.FieldStrategy 3. 在 DatasetApplicationService.updateDataset 方法中: - 添加 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper - 保存原始的 parentDatasetId 值用于比较 - handleParentChange 之后,检查 parentDatasetId 是否发生变化 - 如果发生变化,使用 LambdaUpdateWrapper 显式地更新 parentDatasetId 字段 - 这样即使值为 null 也能被正确更新到数据库 原理: MyBatis-Plus 的 updateById 方法默认只更新非 null 字段。 通过使用 LambdaUpdateWrapper 的 set 方法,可以显式地设置字段值, 包括 null 值,从而确保字段能够被正确更新到数据库。 --- .../application/DatasetApplicationService.java | 17 +++++++++++++++++ .../domain/model/dataset/Dataset.java | 2 -- 2 files changed, 17 insertions(+), 2 deletions(-) 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; /** * 数据集类型