如何在生成之后但在测试执行之前修改数据库模式?

How to modify DB schema after generation but before test execution?

长话短说

我想从 Hibernate 映射生成数据库架构,然后在应用程序启动前用同名视图替换特定的 table。
我如何使用 Spring / Hibernate / DbUnit / JDBC 或其他东西来做到这一点?

我的问题详情

我有一些针对内存数据库执行的集成测试。
真实数据库中有一个 AView 视图,它在 Java 代码中映射为

@Entity @Table @Immutable
public class AView {}

我正在从 Hibernate 映射生成 H2 DB 模式以进行集成测试。在测试应用程序上下文初始化期间,此 视图创建为 table。 来自日志:

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

一些测试因此而失败。

想法

为了解决这个问题,我想让 H2 数据库架构尽可能类似于真实的数据库架构。首先,我想从 Hibernate 映射生成数据库模式,然后将 AView table 替换为 AView 视图。

我试过的

我发现了一个类似的问题:How to execute sql script after db schema generation but before application startup

我创建了一个包含 DROP TABLE / CREATE VIEW 语句的文件 schema.sql。我试图将文件放在 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 {}

数据源-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.

您应该能够使用类路径根目录中的 import.sql 文件作为让 Hibernate 在构建模式后执行一组 SQL 命令的方法。鉴于您希望仅针对测试专门执行此操作,将其放在测试根类路径中就足够了。