Рубрики
Без рубрики

Краткое руководство по загрузке исходных данных с помощью пружинной загрузки

Быстрый и практический пример использования файлов data.sql и schema.sql в Spring Boot.

Автор оригинала: baeldung.

1. Обзор

Spring Boot позволяет очень легко управлять изменениями в нашей базе данных. Если мы оставим конфигурацию по умолчанию, она будет искать сущности в наших пакетах и автоматически создавать соответствующие таблицы.

Но иногда нам понадобится более тонкий контроль над изменениями в базе данных. Именно тогда мы сможем использовать файлы data.sql и schema.sql весной.

2. Файл data.sql

Давайте также предположим, что мы работаем с JPA – и определим простую Страну сущность в нашем проекте:

@Entity
public class Country {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Integer id;
    
    @Column(nullable = false)
    private String name;

    //...
}

Если мы запустим наше приложение, Spring Boot создаст для нас пустую таблицу, но не заполнит ее ничем.

Простой способ сделать это-создать файл с именем data.sql:

INSERT INTO country (name) VALUES ('India');
INSERT INTO country (name) VALUES ('Brazil');
INSERT INTO country (name) VALUES ('USA');
INSERT INTO country (name) VALUES ('Italy');

Когда мы запустим проект с этим файлом в пути к классу, Spring подберет его и использует для заполнения базы данных.

3. Файл schema.sql

Иногда мы не хотим полагаться на механизм создания схемы по умолчанию. В

CREATE TABLE country (
    id   INTEGER      NOT NULL AUTO_INCREMENT,
    name VARCHAR(128) NOT NULL,
    PRIMARY KEY (id)
);

Иногда мы не хотим полагаться на механизм создания схемы по умолчанию. В

Также важно не забыть отключить автоматическое создание схемы, чтобы избежать конфликтов:

spring.jpa.hibernate.ddl-auto=none

4. Управление Созданием Базы Данных С Помощью Hibernate

4. Управление Созданием Базы Данных С Помощью Hibernate

Стандартные значения свойств Hibernate: create , update

  • Стандартные значения свойств Hibernate: create
  • , update
  • update – объектная модель, созданная на основе сопоставлений (аннотаций или XML), сравнивается с существующей схемой, а затем Hibernate обновляет схему в соответствии с различием. Он никогда не удаляет существующие таблицы или столбцы, даже если они больше не требуются приложению update
  • – объектная модель, созданная на основе сопоставлений (аннотаций или XML), сравнивается с существующей схемой, а затем Hibernate обновляет схему в соответствии с различием. Он никогда не удаляет существующие таблицы или столбцы, даже если они больше не требуются приложению update
  • – объектная модель, созданная на основе сопоставлений (аннотаций или XML), сравнивается с существующей схемой, а затем Hibernate обновляет схему в соответствии с различием. Он никогда не удаляет существующие таблицы или столбцы, даже если они больше не требуются приложению update

Spring Boot внутренне устанавливает значение этого параметра по умолчанию в create-drop , если диспетчер схем не был обнаружен, в противном случае none для всех остальных случаев.

Мы должны тщательно установить значение или использовать один из других механизмов для инициализации базы данных.

5. @Sql

Spring также предоставляет аннотацию @Sql — декларативный способ инициализации и заполнения нашей тестовой схемы.

Давайте посмотрим, как использовать аннотацию @Sql для создания

@Sql({"/employees_schema.sql", "/import_employees.sql"})
public class SpringBootInitialLoadIntegrationTest {

    @Autowired
    private EmployeeRepository employeeRepository;

    @Test
    public void testLoadDataForTestClass() {
        assertEquals(3, employeeRepository.findAll().size());
    }
}

Атрибутами аннотации @Sql являются:

  • config – локальная конфигурация для сценариев SQL. Мы описываем это в
  • config – локальная конфигурация для сценариев SQL. Мы описываем это в config – локальная конфигурация для сценариев SQL. Мы описываем это в скрипты –
  • мы можем объявить пути к файлам сценариев SQL, чтобы

Аннотацию @Sql | можно использовать на уровне класса или на уровне метода . Мы можем загрузить дополнительные данные, необходимые для конкретного тестового случая, аннотируя этот метод:

@Test
@Sql({"/import_senior_employees.sql"})
public void testLoadDataForTestCase() {
    assertEquals(5, employeeRepository.findAll().size());
}

6. @SqlConfig

Мы можем настроить способ анализа и запуска сценариев SQL с помощью аннотации @SqlConfig .

@SqlConfig может быть объявлен на уровне класса, где он служит глобальной конфигурацией. Или его можно использовать для настройки конкретной аннотации @Sql .

Давайте рассмотрим пример, в котором мы указываем кодировку наших SQL-скриптов, а также режим транзакций для выполнения скриптов:

@Test
@Sql(scripts = {"/import_senior_employees.sql"}, 
  config = @SqlConfig(encoding = "utf-8", transactionMode = TransactionMode.ISOLATED))
public void testLoadDataForTestCase() {
    assertEquals(5, employeeRepository.findAll().size());
}

И давайте рассмотрим различные атрибуты @SqlConfig :

  • blockCommentStartDelimiter – разделитель для определения начала комментариев блоков в файлах сценариев SQL
  • blockCommentEndDelimiter – разделитель для обозначения конца комментариев блока в файлах сценариев SQL
  • commentPrefix – префикс для идентификации однострочных комментариев в файлах сценариев SQL
  • Источник данных – имя компонента javax.sql.DataSource , с которым будут выполняться сценарии и операторы
  • кодировка – кодировка для файлов сценариев SQL, по умолчанию используется кодировка платформы
  • ErrorMode – режим, который будет использоваться при обнаружении ошибки при выполнении сценариев
  • разделитель – строка, используемая для разделения отдельных операторов, по умолчанию “–”
  • TransactionManager – имя компонента PlatformTransactionManager , который будет использоваться для транзакций
  • transactionMode – режим, который будет использоваться при выполнении скриптов в транзакции

7. @SqlGroup

Java 8 и выше позволяют использовать повторяющиеся аннотации. Эта функция также может быть использована для @Sql аннотаций. Для Java 7 и ниже существует аннотация контейнера — @SqlGroup . Используя аннотацию @SqlGroup , мы можем объявить несколько @Sql аннотаций:

@SqlGroup({
  @Sql(scripts = "/employees_schema.sql", 
    config = @SqlConfig(transactionMode = TransactionMode.ISOLATED)),
  @Sql("/import_employees.sql")})
public class SpringBootSqlGroupAnnotationIntegrationTest {

    @Autowired
    private EmployeeRepository employeeRepository;

    @Test
    public void testLoadDataForTestCase() {
        assertEquals(3, employeeRepository.findAll().size());
    }
}

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

В этой краткой статье мы рассмотрели, как мы можем использовать файлы schema.sql и data.sql для настройки начальной схемы и заполнения ее данными. Мы также видели, как мы можем использовать @Sql, @SqlConfig и @SqlGroup аннотации для загрузки тестовых данных для тестов.

Имейте в виду, что этот подход больше подходит для базовых и простых сценариев, любая расширенная обработка базы данных потребует более продвинутых и усовершенствованных инструментов, таких как Liquibase или Flyway .

Фрагменты кода, как всегда, можно найти на GitHub .