我正在使用在 Tomcat 上运行的非 springboot 应用程序(由于遗留原因)和 spring data JPA。
我的 MySQL 数据库有 JSON 类型的学生字段,用于存储学生列表:
学生.java
@JsonProperty("students"")
@NotNull(message = "Null required field: students")
@Valid
@Convert(converter = MyConverter.class)
private List<StudentNode> students;
MyConverter.java
@Converter
public class MyConverter extends MyBaseConverter<Object> {
}
MyBaseConverter.java
public abstract class MyBaseConverter<T> implements AttributeConverter<List<T>, String> {
private static final ObjectMapper mapper;
static {
mapper = new ObjectMapper();
}
@Override
public String convertToDatabaseColumn(List<T> attribute) {
if (attribute == null || attribute.isEmpty()) {
return null;
}
try {
return mapper.writeValueAsString(attribute);
} catch (JsonProcessingException e) {
return null;
}
}
@Override
public List<T> convertToEntityAttribute(String dbData) {
try {
if (StringUtils.isBlank(dbData)) {
return null;
}
return mapper.readValue(dbData, new TypeReference<List<T>>() {});
} catch (IOException e) {
return null;
}
}
}
StudentNode 类包含学生 ID 和姓名。
StudentRepository.java 使用标准 JPA 存储库,如下所示:
@Repository
public interface StudentRepository extends PagingAndSortingRepository<Student, String> {
}
我正在通过调用保存此学生数据
studentRepository.save(student);
它保存了学生记录,但随后也不必要地调用了学生的更新查询。任何地方都没有外键或任何约束。 在使用 DynamicUpdate 进行调试时,我发现由于 JSON 字段 Students 包含 id 和 name 而发生更新。但我不确定 JPA 是如何或为何这样做的。
我尝试在 StudentNode 和 Student.java 中添加 equals 和 hashcode,但没有成功。
有人在使用 JPA 时遇到过 JSON 列类型的额外更新吗?如何避免这种额外的更新调用?
在 jpa 中,如果现有值与更新值相同,则更新查询不会运行,并且在 json 列中,当您更新 json 中的任何键时,更新的 json 对象的哈希值不会更改。 您可以更新一些其他键,例如updated_on,然后更新功能就可以工作了。