JavaRush/Java блог/Java Developer/Spring — это не страшно, продолжаем наполнять БД
Павел
11 уровень

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 безработный
11 августа 2022, 17:43
new FruitEntity() .setFruitName("Fruit1") .setProviderCode(Math.abs(new Random().nextInt() % 10)) Вот так у меня второй метод красный. Не хочет два последовательно принимать. Если первый метод убрать, тогда второй нормально.
Nik безработный
11 августа 2022, 18:13
Lombok у меня чего-то не работает
Павел
Уровень 11
12 августа 2022, 05:53
Попробуй в IDEA сдедать File - Invalidate Caches
Alexey
Уровень 1
12 декабря 2020, 12:58
Спасибо за статьи. пока все понятно)
Павел
Уровень 11
13 декабря 2020, 20:15
Спасибо за отзыв! Не забывайте что нужно читать литературу по теории)