Как сохранить несколько значений одного узла xml при весенней загрузке?

У меня есть XML-ответ от веб-службы в следующем формате:

<main-node>
    <node>
        <id>101</id>
        <name>Test</name>
        <address>test</address>
        <address>test1</address>
    </node>
    <node>
       <id>102</id>
       <name>Jack</name>
       <address>New York</address>
       <address>London</address>
       <address>Canberra</address>
       <address>Cape Town</address>
    </node>
</main-node>

Я создал классы POJO, хорошо их сопоставил и могу хранить значения в базе данных MySQL. Однако для поля address сохраняется только один из адресов. Как сохранить несколько значений в базе данных?

Это POJO, который я использую для упомянутой ранее структуры XML:

@Entity
@XmlRootElement(name = "node")
public class Node{
    @Id
    private int id;
    private String name;
    private String address;
    //Getters and Setters
}

Я уже пробовал использовать String[] для поля address, но это тоже не сработало.

Покажите код для вашего класса POJO. Если это только для 1 значения данных, он не сможет поймать оба.

Gimhani 04.09.2018 13:10

Я обновил вопрос.

Himanshu Thapa 04.09.2018 13:24

Используйте XmlMapper xmlMapper = new XmlMapper (); xmlMapper.configure (DeserializationFeature.ACCEPT_SINGLE_VAL‌ UE_AS_ARRAY, true);

Gimhani 04.09.2018 13:34

Где мне хранить этот фрагмент кода? Я здесь новичок и извиняюсь, если мой вопрос глупый.

Himanshu Thapa 04.09.2018 13:38

См. Эту статью stackify.com/java-xml-jackson. Вы можете получить поток ввода и передать его указанному выше сопоставителю с типом требуемого bean-компонента как xmlmapper.readvalue (stream, Node.class)

Gimhani 04.09.2018 14:07

@HimanshuThapa можете ли вы изменить формат ответа Xml-ответа? или вы вынуждены так использовать?

MohammadReza Alagheband 04.09.2018 15:23

@MohammadReza Не думаю, что смогу изменить формат ответа. На самом деле я работаю с веб-сервисом cVent.

Himanshu Thapa 05.09.2018 04:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
255
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что поле address будет сопоставлено столбцу с именем address в MySQL, а столбцы базы данных могут содержать только одно значение.

Решение состоит в том, чтобы создать отношение «один ко многим», что означает, что вам нужна отдельная таблица node_address рядом с таблицей node, которая содержит как минимум поля node_id и address.

Schema of one-to-many relationship

Теперь для сопоставления JPA вы можете выбрать полное сопоставление @OneToMany / @ManyToOne, но в этом случае использование @ElementCollection может быть более интересным:

@Entity
@XmlRootElement(name = "node")
public class Node {
    @Id
    private int id;
    private String name;
    @ElementCollection
    @CollectionTable(
        name = "NODE_ADDRESS",
        joinColumns=@JoinColumn(name = "NODE_ID")
    )
    @Column(name = "ADDRESS")
    private List<String> address;

    // Getters + Setters
}

Поскольку Hibernate (поставщик JPA по умолчанию) не может отображать массивы, вам необходимо использовать List<String> для поля address. Если вам это не нравится, вам придется создать несколько классов: один для сопоставления XML, а другой - для сопоставления JPA.

Note: You're missing a mapping for your element, so you'll have to create a MainNode class as well.

Спасибо. На самом деле мне пришлось внести некоторые изменения в свой код, но этот @Elementcollection работал.

Himanshu Thapa 10.09.2018 14:20

Другие вопросы по теме