You've already forked DataMate
fix: 修复编辑数据集时无法清除关联数据集的编译问题
问题分析: 之前尝试使用 @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 值,从而确保字段能够被正确更新到数据库。
This commit is contained in:
@@ -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<Dataset>()
|
||||
.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;
|
||||
}
|
||||
|
||||
@@ -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<String> {
|
||||
/**
|
||||
* 父数据集ID
|
||||
*/
|
||||
@TableField(updateStrategy = FieldStrategy.IGNORED)
|
||||
private String parentDatasetId;
|
||||
/**
|
||||
* 数据集类型
|
||||
|
||||
Reference in New Issue
Block a user