Как сохранить несколько значений одного узла xml при весенней загрузке? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть 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, но это тоже не сработало.

1 Ответ

0 голосов
/ 04 сентября 2018

Проблема в том, что поле 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.

Примечание : вам не хватает сопоставления для вашего элемента, поэтому вам также придется создать класс MainNode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...