gpt4 book ai didi

java - 将列表序列化为 JSON 数组

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:44 24 4
gpt4 key购买 nike

我有一个 JPA 实体,其中一个字段为自定义对象列表。使用 Jackson 转换器,我已成功将此列表作为 JSON 数组保存到 MySQL 数据库中,但在初始创建后我无法插入到此列表中。

我可以成功检索现有列表,在内存中添加一个新对象(并测试它是否已插入),然后通过 Spring REST 存储库保存它。然而,它似乎永远不会持续下去。有任何想法吗?这是我的代码(这是一个 Spring Boot 项目仅供引用):

内部有列表的候选实体

@Entity
@Table(name = "Candidates", schema = "Candidate")
public class Candidate extends ResourceSupport {

@Id
@Column(name = "CandidateID")
private Long candidateID;

// More fields

@Column(name = "Fields")
@Convert(converter = CollectionConverter.class)
private List<CandidateField> fields;

//Getters & setters
}

CandidateField 类构成了上面的列表。 CandidateField 只是一个对存储在 Candidate 表中单个字段中的 JSON 进行建模的 POJO,它不是一个独立的实体。

public class CandidateField {

private Long fieldID;
private String name;
private boolean current;

public CandidateField () {

}

public CandidateField (Long fieldID, String name, boolean current) {
this.fieldID = fieldID;
this.name = name;
this.current = current;
}

//Getters & Setters
}

转换器

public class CollectionConverter implements AttributeConverter<List<CandidateField>, String> {

private ObjectMapper objectMapper = new ObjectMapper();

@Override
public String convertToDatabaseColumn(List<CandidateField> object) {
try {
return objectMapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
return "";
}
}

@Override
public List<CandidateField> convertToEntityAttribute(String data) {
try {
return objectMapper.readValue(data, new TypeReference<List<CandidateField>>() {});
} catch (Exception e) {
e.printStackTrace();
return null;
}
}

持久保存到数据库的代码

public void addField(Long fieldID, Long candidateID) {
Candidate candidate = repository.findOne(candidateID);
candidate.getFields().add(new CandidateField(fieldID, "", true));
repository.saveAndFlush(candidate);
}

存储库

@RepositoryRestResource
public interface CandidateRepository extends JpaRepository<Candidate,Long>{}

我似乎无法弄清楚为什么这种情况不会持续下去。任何帮助将非常感激。干杯!

最佳答案

考虑定义 cascade type供您 Collection 。

当您保存 Candidate 对象时,默认情况下操作不会级联,因此您需要自己定义它,除非您直接保存 CandidateField 对象。

关于java - 将列表序列化为 JSON 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39088456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com