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 .