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

Короче

Я хочу сгенерировать схему БД из сопоставлений 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 как можно более похожей на реальную схему БД. Сначала я хочу сгенерировать схему БД из сопоставлений Hibernate, а затем заменить таблицу AView представлением AView.

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

Нашел похожий вопрос: Как выполнить 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 framework - 4.1.9.RELEASE.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Оно работает! Хотя мне пришлось переформатировать мой оператор CREATE VIEW из-за ошибки H2, упомянутой здесь: stackoverflow.com/q/27317144/1429387

naXa 14.05.2018 15:15

Другие вопросы по теме