«1. Введение

В этой быстрой статье мы рассмотрим заполнители репозитория Spring JPA на небольшом примере. Заполнитель репозитория Spring Data JPA — отличная альтернатива скрипту data.sql.

Средство заполнения репозитория Spring Data JPA поддерживает форматы файлов JSON и XML. В следующих разделах мы увидим, как использовать заполнитель репозитория Spring Data JPA.

2. Пример приложения

Прежде всего, предположим, что у нас есть класс объектов Fruit и набор фруктов для заполнения нашей базы данных:

@Entity
public class Fruit {
    @Id
    private long id;
    private String name;
    private String color;
    
    // getters and setters
}

Мы расширим JpaRepository для чтения данных Fruit из базы данных. :

@Repository
public interface FruitRepository extends JpaRepository<Fruit, Long> {
    // ...
}

В следующем разделе мы будем использовать формат JSON для хранения и заполнения исходных данных фруктов.

3. Наполнители репозитория JSON

Давайте создадим файл JSON с данными Fruit. Мы создадим этот файл в src/main/resources и назовем его fruit-data.json:

[
    {
        "_class": "com.baeldung.entity.Fruit",
        "name": "apple",
        "color": "red",
        "id": 1
    },
    {
        "_class": "com.baeldung.entity.Fruit",
        "name": "guava",
        "color": "green",
        "id": 2
    }
]

Имя класса сущности должно быть указано в поле _class каждого объекта JSON. Остальные ключи сопоставляются со столбцами нашей сущности Fruit.

Теперь мы добавим зависимость jackson-databind в pom.xml:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>

Наконец, нам нужно добавить bean-компонент заполнения репозитория. Этот bean-компонент заполнения репозитория будет считывать данные из файла fruit-data.json и заполнять их в базе данных при запуске приложения:

@Bean
public Jackson2RepositoryPopulatorFactoryBean getRespositoryPopulator() {
    Jackson2RepositoryPopulatorFactoryBean factory = new Jackson2RepositoryPopulatorFactoryBean();
    factory.setResources(new Resource[]{new ClassPathResource("fruit-data.json")});
    return factory;
}

Все готово для модульного тестирования нашей конфигурации:

@Test
public void givenFruitJsonPopulatorThenShouldInsertRecordOnStart() {
    List<Fruit> fruits = fruitRepository.findAll();
    assertEquals("record count is not matching", 2, fruits.size());

    fruits.forEach(fruit -> {
        if (1 == fruit.getId()) {
            assertEquals("apple", fruit.getName());
            assertEquals("red", fruit.getColor());
        } else if (2 == fruit.getId()) {
            assertEquals("guava", fruit.getName());
            assertEquals("green", fruit.getColor());
        }
    });
}

4. Заполнители репозитория XML

В этом разделе мы увидим, как использовать XML-файлы с заполнителями репозитория. Во-первых, мы создадим XML-файл с необходимой информацией о Fruit.

Здесь файл XML представляет данные одного фрукта.

apple-fruit-data.xml:

<fruit>
    <id>1</id>
    <name>apple</name>
    <color>red</color>
</fruit>

guava-fruit-data.xml:

<fruit>
    <id>2</id>
    <name>guava</name>
    <color>green</color>
</fruit>

Опять же, мы храним эти файлы XML в src/main/resources.

Кроме того, мы добавим зависимость maven spring-oxm в pom.xml:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-oxm</artifactId>
    <version>5.1.5.RELEASE</version>
</dependency>

Кроме того, нам нужно добавить аннотацию @XmlRootElement к нашему классу сущности:

@XmlRootElement
@Entity
public class Fruit {
    // ...
}

Наконец, мы определим bean-компонент заполнения репозитория. Этот bean-компонент будет читать файл XML и заполнять данные:

@Bean
public UnmarshallerRepositoryPopulatorFactoryBean repositoryPopulator() {
    Jaxb2Marshaller unmarshaller = new Jaxb2Marshaller();
    unmarshaller.setClassesToBeBound(Fruit.class);

    UnmarshallerRepositoryPopulatorFactoryBean factory = new UnmarshallerRepositoryPopulatorFactoryBean();
    factory.setUnmarshaller(unmarshaller);
    factory.setResources(new Resource[] { new ClassPathResource("apple-fruit-data.xml"), 
      new ClassPathResource("guava-fruit-data.xml") });
    return factory;
}

Мы можем проводить модульное тестирование модуля заполнения репозитория XML точно так же, как и с модулем заполнения JSON.

4. Заключение

В этом руководстве мы узнали, как использовать заполнитель репозитория Spring Data JPA. Полный исходный код, используемый для этого руководства, доступен на GitHub.