INSERT полей из List в базу данных с помощью Spring Data JPA и @Entity

Всем привет!)

1.У меня есть List valuteCurs valuteCurs.add(new ValuteCurs(NumCode, CharCode, Nominal, Name, Value))

  1. Есть сущность
@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;
  1. Есть репозиторий
@Repository
public interface ValuteCursRepository extends JpaRepository<ValuteCursEntity, Long> {
}
  1. От меня требуется добавить данные поля объекта в БД. Я еще стажер Java но задача есть задача)) Кто может помочь советом, сижу который час уже.

  2. Пробовал такой метод 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 шт):

Автор решения: petrovich

Добавьте в проект 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. Ознакомиться с соглашениями о наименованиях можно здесь.

Еще момент - у вас логика сохранения прописана в классе контроллера и идет напрямую обращение к нему. Вынесите в отдельный класс эту логику и его вызывайте в контроллере.

→ Ссылка