У меня есть 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, но это тоже не сработало.
Я обновил вопрос.
Используйте XmlMapper xmlMapper = new XmlMapper (); xmlMapper.configure (DeserializationFeature.ACCEPT_SINGLE_VAL UE_AS_ARRAY, true);
Где мне хранить этот фрагмент кода? Я здесь новичок и извиняюсь, если мой вопрос глупый.
См. Эту статью stackify.com/java-xml-jackson. Вы можете получить поток ввода и передать его указанному выше сопоставителю с типом требуемого bean-компонента как xmlmapper.readvalue (stream, Node.class)
@HimanshuThapa можете ли вы изменить формат ответа Xml-ответа? или вы вынуждены так использовать?
@MohammadReza Не думаю, что смогу изменить формат ответа. На самом деле я работаю с веб-сервисом cVent.




Проблема в том, что поле address будет сопоставлено столбцу с именем address в MySQL, а столбцы базы данных могут содержать только одно значение.
Решение состоит в том, чтобы создать отношение «один ко многим», что означает, что вам нужна отдельная таблица node_address рядом с таблицей node, которая содержит как минимум поля node_id и address.
Теперь для сопоставления 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 работал.
Покажите код для вашего класса POJO. Если это только для 1 значения данных, он не сможет поймать оба.