【问题标题】:Serializing List to JSON Array将列表序列化为 JSON 数组
【发布时间】:2016-12-29 12:45:33
【问题描述】:

我有一个 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 只是一个 POJO,它对存储在 Candidate 表中的单个字段中的 JSON 进行建模,它不是一个独立的实体。

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>{}

我似乎无法弄清楚为什么这不会持续存在。任何帮助将不胜感激。干杯!

【问题讨论】:

    标签: java json spring jpa jackson


    【解决方案1】:

    考虑为您的收藏定义cascade type

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

    【讨论】:

    • 嗨,Brian,级联类型只适用于实体,不是吗? CandidateField 只是一个 POJO,它对存储在 Candidate 表中的单个字段中的 JSON 进行建模,它不是一个独立的实体。谢谢!
    • 哦,感谢您指出 CandidateField 只是一个 POJO。我不知何故忽略了它。但是,如果您愿意提供一个带有内存数据库的精简测试用例(可能与 JUnit 一起使用),我很乐意再看看它。
    猜你喜欢
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2011-09-21
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多