INSERT полей из List в базу данных с помощью Spring Data JPA и @Entity
Всем привет!)
1.У меня есть List valuteCurs valuteCurs.add(new ValuteCurs(NumCode, CharCode, Nominal, Name, Value))
- Есть сущность
@Entity
@Data
@NoArgsConstructor
@Table(name = "base_currency")
public class ValuteCursEntity extends BaseEntity{
@Column(name = "num_code")
private int num_code;
@Column (name = "char_code")
private String char_code;
@Column(name = "nominal")
private int nominal;
@Column(name = "name")
private String name;
@Column(name = "value")
private String value;
- Есть репозиторий
@Repository
public interface ValuteCursRepository extends JpaRepository<ValuteCursEntity, Long> {
}
От меня требуется добавить данные поля объекта в БД. Я еще стажер Java но задача есть задача)) Кто может помочь советом, сижу который час уже.
Пробовал такой метод getValuteCursEntity() в классе XmlParser
ValuteCursEntity valuteCursEntity = new ValuteCursEntity();
for (ValuteCurs vc : valuteCurs){
valuteCursEntity.setNum_code(vc.getNumCode());
valuteCursEntity.setValue(vc.getValue());
valuteCursEntity.setNominal(vc.getNominal());
valuteCursEntity.setName(vc.getName());
valuteCursEntity.setChar_code(vc.getCharCode());
}
return valuteCursEntity;
И дальше в контроллере сохранить эту сущность в репозиторий.
@GetMapping
public List<ValuteCursEntity> getValuteCurs () throws Exception {
valuteCursRepository.save(xmlParser.getValuteCursEntity());
return valuteCursRepository.findAll();
}
НО СОХРАНЯЕТСЯ В БД ТОЛЬКО ПОСЛЕДНИЙ ОБЪЕКТ ИЗ List(пробовал два раза) Не могу это обойти, подскажите как быть!) Спасибо)
Парс XML:
public class XmlParser {
public ValuteCursEntity getValuteCursEntity() throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new URL("http://www.cbr.ru/scripts/XML_daily.asp").openStream());
List<ValuteCurs> valuteCurs = new ArrayList<>();
NodeList nodeList = doc.getDocumentElement().getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element elem = (Element) node;
Integer NumCode = Integer.parseInt(elem.getElementsByTagName("NumCode")
.item(0).getChildNodes().item(0).getNodeValue());
String CharCode = elem.getElementsByTagName("CharCode").item(0)
.getChildNodes().item(0).getNodeValue();
Integer Nominal = Integer.parseInt(elem.getElementsByTagName("Nominal")
.item(0).getChildNodes().item(0).getNodeValue());
String Name = elem.getElementsByTagName("Name").item(0)
.getChildNodes().item(0).getNodeValue();
String Value = elem.getElementsByTagName("Value").item(0)
.getChildNodes().item(0).getNodeValue();
valuteCurs.add(new ValuteCurs(NumCode, CharCode, Nominal, Name, Value));
}
}
*И класс *
@Data
public class ValuteCurs {
private int numCode;
private String charCode;
private int nominal;
private String name;
private String value;
public ValuteCurs(int numCode, String charCode, int nominal, String name, String value) {
this.numCode = numCode;
this.charCode = charCode;
this.nominal = nominal;
this.name = name;
this.value = value;
}
}
Ответы (1 шт):
Добавьте в проект MapStruct и используйте его для маппинга из ValuteCurs в ValuteCursEntity.
Либо создайте еще одну коллекцию, типизированную ValuteCursEntity и добавляйте в нее сразу вместо создания объекта ValuteCurs.
Ваш класс должен принять такой вид после правок:
public class XmlParser {
public Collection<ValuteCursEntity> getValuteCursEntity() throws Exception {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new URL("http://www.cbr.ru/scripts/XML_daily.asp").openStream());
List<ValuteCursEntity> currencies = new ArrayList<>();
NodeList nodeList = doc.getDocumentElement().getChildNodes();
for (int i = 0; i < nodeList.getLength(); i++) {
Node node = nodeList.item(i);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element elem = (Element) node;
Integer NumCode = Integer.parseInt(elem.getElementsByTagName("NumCode")
.item(0).getChildNodes().item(0).getNodeValue());
String CharCode = elem.getElementsByTagName("CharCode").item(0)
.getChildNodes().item(0).getNodeValue();
Integer Nominal = Integer.parseInt(elem.getElementsByTagName("Nominal")
.item(0).getChildNodes().item(0).getNodeValue());
String Name = elem.getElementsByTagName("Name").item(0)
.getChildNodes().item(0).getNodeValue();
String Value = elem.getElementsByTagName("Value").item(0)
.getChildNodes().item(0).getNodeValue();
currencies.add(new ValuteCursEntity(NumCode, CharCode, Nominal, Name, Value));
}
}
return currencies;
}
}
Далее в репозитории вам необходимо сохранять полученную коллецию методом saveAll().
Не используйте в именах переменных подчеркивания - в java принят стиль наименования CamelCase. Ознакомиться с соглашениями о наименованиях можно здесь.
Еще момент - у вас логика сохранения прописана в классе контроллера и идет напрямую обращение к нему. Вынесите в отдельный класс эту логику и его вызывайте в контроллере.
