Как изменить схему БД после генерации, но до выполнения теста? - PullRequest
0 голосов
/ 14 мая 2018

Короче говоря

Я хочу сгенерировать схему БД из сопоставлений Hibernate, а затем заменить конкретную таблицу представлением с тем же именем до запуска приложения.
Как это сделать с помощью Spring /Hibernate / DbUnit / JDBC или что-то еще?

Моя проблема в деталях

У меня есть несколько интеграционных тестов, которые выполняются для базы данных в памяти.
Есть представление AViewв реальной базе данных и отображается в коде Java как

@Entity @Table @Immutable
public class AView {}

Я генерирую схему H2 DB из отображений Hibernate для интеграционных тестов.И во время инициализации контекста тестового приложения это представление создается в виде таблицы. Из журналов:

Hibernate: drop table AView if exists
Hibernate: create table AView (...)

Из-за этого некоторые тесты не выполняются.

Идея

Чтобы это исправить, я хочу сделать схему H2 DB максимально похожей на реальную схему DB.Сначала я хочу сгенерировать схему БД из отображений Hibernate, а затем заменить таблицу AView на AView view.

Что я пробовал

Я нашел похожий вопрос: Как выполнить скрипт sql после генерации схемы БД, но перед запуском приложения

Я создал файл schema.sql с операторами DROP TABLE / CREATE VIEW.Я пытался поместить файл в src / test / resources / schema.sql, но Spring не подхватил его автоматически.Я попытался указать этот файл явно в аннотации @Sql, но он все еще не имеет видимого эффекта.

Я выполняю тесты через IntelliJ IDEA (если это важно).

Мой код

Тест и контекст приложения тестирования:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TestH2Config.class })
@TransactionConfiguration(defaultRollback = true)
@Transactional
public class AViewServiceIT {}

@Configuration
@PropertySource({"classpath:datasource-h2.properties"})
@EnableTransactionManagement
//@Sql({"/schema.sql"})
public class TestH2Config {}

datasource-h2.properties

datasource.driverClassName=org.h2.Driver
datasource.url=jdbc:h2:mem:itest;MODE=MSSQLServer;DB_CLOSE_ON_EXIT=FALSE;DB_CLOSE_DELAY=-1;INIT=CREATE SCHEMA IF NOT EXISTS itest\\;SET SCHEMA itest 
datasource.username=sa
datasource.password=

hibernate.dialect=org.hibernate.dialect.H2Dialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=create-drop

Версия платформы Spring - 4.1.9.RELEASE.

1 Ответ

0 голосов
/ 14 мая 2018

Вы должны иметь возможность использовать файл import.sql в корне вашего пути к классам в качестве средства, чтобы Hibernate выполнял набор команд SQL после построения схемы.Учитывая, что вы хотите сделать это специально только для тестов, достаточно поместить его в корневой каталог классов теста.

...