Вопрос:

Сериализация списка в массив JSON

java json spring jpa jackson

1453 просмотра

1 ответ

32 Репутация автора

У меня есть объект JPA со списком пользовательских объектов в качестве одного из его полей. Используя конвертер Джексона, мне удалось сохранить этот список в виде массива JSON в базе данных MySQL, но я не могу вставить этот список после его первоначального создания.

Я могу успешно извлечь существующий список, добавить новый объект в память (и проверить, что он был вставлен), а затем сохранить его через репозиторий Spring REST. Тем не менее, это, кажется, никогда не сохраняется. Есть идеи? Вот мой код (это проект Spring Boot FYI):

Кандидат-сущность со списком внутри

@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 = CustomConverter.class)
private List<CandidateField> fields;

//Getters & setters
}

Класс CandidateField, который составляет список выше. CandidateField - это просто POJO, который моделирует JSON, хранящийся в одном поле в таблице Candidate, и не является независимой сущностью.

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

Я не могу понять, почему это не будет продолжаться. Любая помощь будет очень ценится. Ура!

Автор: Faizan Ali Источник Размещён: 22.08.2016 08:46

Ответы (1)


0 плюса

729 Репутация автора

Рассмотрите возможность определения каскадного типа для вашей коллекции.

Когда вы сохраняете свои Candidateобъекты, операция не будет каскадно по умолчанию, поэтому вам нужно определить ее самостоятельно, если вы не сохраните свои CandidateFieldобъекты напрямую.

Автор: Brian Размещён: 22.08.2016 09:21
Вопросы из категории :
32x32