【发布时间】:2020-04-16 15:09:10
【问题描述】:
让我们从这个实体开始:
@Entity
public class MyEntity {
...
@Column(length = 80)
private String description;
@Column(name = "enum_column", precision = 18)
@Convert(converter = EnumColumnConverter.class)
private MyEnum enumColumn;
...
}
在这里,您会看到两个可以为空的列(在我的实体和数据库中)。转换器将枚举替换为数据库中的 Long 值。相应地定义了一个存储库类:
@Repository
public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {}
DTO 是从服务包中定义的:
public class MyEntityDto {
...
private String description;
private MyEnum enumColumn;
...
}
DTO 和实体之间的映射是使用 Dozer 完成的。 DTO 是从 Java FX UI 修改的。在 UI 和持久性之间定义了一个服务来保存修改的实体。
@Service
@Transactional
public class MyEntityService {
@Autowired MyEntityRepository myEntityRepository;
...
public List<MyEntityDto> save(List<MyEntityDto> dtosToSave) {
List<MyEntityDto> results = Collections.emptyList();
if (dtosToSave != null && !dtosToSave.empty()) {
Iterable<MyEntity> entities = convertDtosWithDozer(dtosToSave);
List<MyEntity> savedEntities = myEntityRepository.saveAll(entities);
results = convertEntitiesWithDozer(savedEntities);
}
return results;
}
在 UI 中,我修改了现有行,其中 description 和 enumColumn 都不是 null。这两个值都设置为null。
问题是它们都没有在数据库中设置为null。在日志中,Hibernate 生成的update 请求不包括这些列。当我调试代码时,这些列是 dtosToSave、entities、savedEntities 和 results 中的 null。
我为MyEntityRepository 创建了一个单元测试,我在其中保存了一个非空description 和entityColumn 的实体。我使用存储库从数据库重新加载实体,以确保这些列不为空。我将它们设置为null,保存实体,然后从数据库中加载回来。现在这两列确实是null,这正是我所期待的。
我的问题:我在这里缺少什么?为什么存储库不保存null 列?如果我设置任何非 null 值,它会完美运行。
提前致谢。
更新:我的问题可能与此有关吗? Jpa Repository save() doesn't update existing data
【问题讨论】:
-
为什么要使用这个转换器?它有什么作用?
-
@CodeScale 正如我提到的,转换器用于将数据库中的枚举替换为 long。我们目前正在更新软件。数据库中允许进行最少的修改。并且有很多遗留代码使用这些信息。但这不是问题...
-
@CodeScale 我选择了这两列,但可能是其他列。
-
在您的存储库中,您将 Long 定义为 Pk 类型。在您的实体中看不到 Id 吗?
-
@CodeScale 是的,有一个 id。如果您注意到,该类的内容以“...”开头和结尾,这意味着还有其他列和方法。我省略了它们,因为我认为没有必要用它们来描述问题。我想展示一个列有问题的示例。如果没有看到一个 id 并假设有一个,真的会令人困惑吗?您要我添加整个实体吗?正好有 43 列,包括一个 ID……如果你真的想要,我可以做到。