使用 Spring Data JPA 时插入,然后使用 JSON 列类型进行更新调用

问题描述 投票:0回答:1

我正在使用在 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 列类型的额外更新吗?如何避免这种额外的更新调用?

spring hibernate jpa spring-data-jpa jpa-2.1
1个回答
0
投票

在 jpa 中,如果现有值与更新值相同,则更新查询不会运行,并且在 json 列中,当您更新 json 中的任何键时,更新的 json 对象的哈希值不会更改。 您可以更新一些其他键,例如updated_on,然后更新功能就可以工作了。

© www.soinside.com 2019 - 2024. All rights reserved.