Spring — это не страшно, продолжаем наполнять БД

Статья из группы Java Developer
СОДЕРЖАНИЕ ЦИКЛА СТАТЕЙ Берем проект из предыдущих частей и продолжаем над ним работать. Добавим к существующей сущности Fruit (фрукты) новую Provider (поставщик). На ProviderEntity повесим еще одну аннотацию от ломбока @Accessors(chain = true), она позволяет автоматически сгенерировать сеттеры, которые возвращают this вместо void и вызывать их в стиле билдера. Так же повесьте эту аннотацию на FruitEntity B пакете entities создаем новый класс


import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.annotations.GenericGenerator;

import javax.persistence.*;

@Accessors(chain = true) //зачем она нужна увидим позже
@Entity
@Data
@Table(name = "provider_table")
public class ProviderEntity {

    @Id
    @Column(name = "id_provider")
    @GenericGenerator(name = "generator", strategy = "increment")
    @GeneratedValue(generator = "generator")
    private Integer id;

    @Column(name = "provider_name")
    private String providerName;

}
Так же по уже знакомой схеме создаем: interface ProviderRepositiry;

package ru.java.rush.repositories;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import ru.java.rush.entities.ProviderEntity;

@Repository
public interface ProviderRepository extends JpaRepository<ProviderEntity,Integer> {
}
class ProviderServise;

package ru.java.rush.services;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import ru.java.rush.entities.ProviderEntity;
import ru.java.rush.repositories.ProviderRepository;

import java.util.List;

@Service
@RequiredArgsConstructor
public class ProviderService {

    private final ProviderRepository providerRepository;

    public void saveAll(List<ProvidErentity> providerEntity){
        providerRepository.saveAll(providerEntity);
    }

    public void save(ProviderEntity providerEntity){
        providerRepository.save(providerEntity);
    }
    
    public List<ProviderEntity> getAll(){ //аналогично добавте метод поиска getAll() в сервис фруктов
       return providerRepository.findAll();
    }
}
Сделаем наполнение базы более интересным. Переходим в класс утилиты

package ru.java.rush.utils;

import lombok.RequiredArgsConstructor;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Service;
import ru.java.rush.services.FruitService;

@Service
@RequiredArgsConstructor
public class InitiateUtils implements CommandLineRunner {

    private final FruitService fruitService;

    @Override
    public void run(String... args) throws Exception {

        //здесь будем много писать
 
    }
}
Благодаря @Accessors(chain = true) мы можем заполнить (проинициализировать) List следующим образом: Попытайтесь это не копировать, а написать руками, а потом и понять:

 List<FruitEntity> fruit = new ArrayList<>(   //тут создаем обычный ArrayList
                Arrays.asList(                              //здесь мы создаем обертку, которая превращает список объектов FruitEntity в List
                        new FruitEntity()                 //создаем экземпляр класса FruitEntity 
                                .setFruitName("Fruit1")       //через сеттеры заполняем поля сущности
                                .setProviderCode(1)
                )
        );
без @Accessors(chain = true) это было бы так

List<FruitEntity> fruit = new ArrayList<>();
        FruitEntity fruitEntity = new FruitEntity();
        fruitEntity.setFruitName("Fruit1");
        fruitEntity.setProviderCode(1);
        fruit.add(fruitEntity);;
Вроде и не велика разница, там строчек и тут пять строчек, но что если нужно внести двадцать штук объектов в лист? Такая бы портянка получилась! Она и так не маленькая, смотрим, читаем, копируем InitiateUtils который должен быть

package ru.java.rush.utils;

import ...;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;


@Service
@RequiredArgsConstructor
public class InitiateUtils implements CommandLineRunner {

    private final FruitService fruitService;
    private final ProviderService providerService;


    @Override
    public void run(String... args) throws Exception {
//инициализируем таблицу с фруктами
        List<FruitEntity> fruit = new ArrayList<>(
                Arrays.asList(
                        new FruitEntity()
                                .setFruitName("Fruit1")
                                .setProviderCode(Math.abs(new Random().nextInt() % 10)),//сюда добавлен метод рандомного числа от 0 до 10
                        new FruitEntity()
                                .setFruitName("Fruit2")
                                .setProviderCode(Math.abs(new Random().nextInt() % 10)),
                        new FruitEntity()
                                .setFruitName("Fruit3")
                                .setProviderCode(Math.abs(new Random().nextInt() % 10)),
                        new FruitEntity()
                                .setFruitName("Fruit4")
                                .setProviderCode(Math.abs(new Random().nextInt() % 10)),
                        new FruitEntity()
                                .setFruitName("Fruit5")
                                .setProviderCode(Math.abs(new Random().nextInt() % 10)),
                        new FruitEntity()
                                .setFruitName("Fruit6")
                                .setProviderCode(Math.abs(new Random().nextInt() % 10)),
                        new FruitEntity()
                                .setFruitName("Fruit7")
                                .setProviderCode(Math.abs(new Random().nextInt() % 10)),
                        new FruitEntity()
                                .setFruitName("Fruit8")
                                .setProviderCode(Math.abs(new Random().nextInt() % 10)),
                        new FruitEntity()
                                .setFruitName("Fruit9")
                                .setProviderCode(Math.abs(new Random().nextInt() % 10))
                )
        );
        
//инициализируем таблицу с поставщиками
        List<ProviderEntity> provider = new ArrayList<>(
                Arrays.asList(
                        new ProviderEntity()
                                .setProviderName("Provider1"),
                        new ProviderEntity()
                                .setProviderName("Provider2"),
                        new ProviderEntity()
                                .setProviderName("Provider3"),
                        new ProviderEntity()
                                .setProviderName("Provider4"),
                        new ProviderEntity()
                                .setProviderName("Provider5")
                )
        );

       fruitService.saveAll(fruit);//сохраняем List фруктов

        System.out.println("\nТаблица фруктов");
        for (FruitEntity fruitEntity : fruitService.getAll()) {
            System.out.println(fruitEntity);
        }

        providerService.saveAll(provider);//сохраняем List поставщиков

        System.out.println("\nТаблица поставщиков");
        for (ProviderEntity providerEntity : providerService.getAll()) {
            System.out.println(providerEntity);
        }
    }
}
Давайте запустим и по смотрим: Таблица фруктов FruitEntity(id=1, fruitName=Fruit1, providerCode=2) FruitEntity(id=2, fruitName=Fruit2, providerCode=8) FruitEntity(id=3, fruitName=Fruit3, providerCode=4) FruitEntity(id=4, fruitName=Fruit4, providerCode=7) FruitEntity(id=5, fruitName=Fruit5, providerCode=9) FruitEntity(id=6, fruitName=Fruit6, providerCode=2) FruitEntity(id=7, fruitName=Fruit7, providerCode=6) FruitEntity(id=8, fruitName=Fruit8, providerCode=5) FruitEntity(id=9, fruitName=Fruit9, providerCode=6) Таблица поставщиков ProviderEntity(id=1, providerName=Provider1) ProviderEntity(id=2, providerName=Provider2) ProviderEntity(id=3, providerName=Provider3) ProviderEntity(id=4, providerName=Provider4) ProviderEntity(id=5, providerName=Provider5) Дальше будем делать запросы к БД по сложнее, для этого хорошо бы понимать SQL. Следующая статья
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Nik Уровень 39, Калининград, Россия
11 августа 2022
new FruitEntity() .setFruitName("Fruit1") .setProviderCode(Math.abs(new Random().nextInt() % 10)) Вот так у меня второй метод красный. Не хочет два последовательно принимать. Если первый метод убрать, тогда второй нормально.
Alexey Уровень 1
12 декабря 2020
Спасибо за статьи. пока все понятно)