长话短说
我想从 Hibernate 映射生成数据库架构,然后在应用程序启动之前用同名 View 替换特定表。
我如何使用 Spring/Hibernate/DbUnit/JDBC 或其他东西来做到这一点?
我的问题详情
我有一些针对内存数据库执行的集成测试。
真实数据库中有一个 AView
View ,它在 Java 代码中映射为
@Entity @Table @Immutable
public class AView {}
我正在从 Hibernate 映射生成 H2 DB 架构以进行集成测试。在测试应用程序上下文初始化期间,此 View 被创建为表格。来自日志:
Hibernate: drop table AView if exists
Hibernate: create table AView (...)
一些测试因此失败。
想法
为了解决这个问题,我想让 H2 DB 模式尽可能与真实的 DB 模式相似。首先,我想从 Hibernate 映射生成数据库架构,然后用 AView
View 替换 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 命令的方法。鉴于您希望专门针对测试执行此操作,将其放在测试根类路径中应该就足够了。
关于java - 如何在生成之后但测试执行之前修改数据库模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50329291/