Я хочу сгенерировать схему БД из сопоставлений 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.




Вы должны иметь возможность использовать файл import.sql в корне пути к классам как средство, позволяющее Hibernate выполнять набор команд SQL после построения схемы. Учитывая, что вы хотите сделать это специально только для тестов, достаточно поместить его в корневой путь к классам теста.
Оно работает! Хотя мне пришлось переформатировать мой оператор
CREATE VIEWиз-за ошибки H2, упомянутой здесь: stackoverflow.com/q/27317144/1429387