java - 如何在生成后但在测试执行之前修改数据库模式?
问题描述
长话短说
我想从 Hibernate 映射生成 DB 模式,然后在应用程序启动之前用同名视图替换特定表。
如何使用 Spring / Hibernate / DbUnit / JDBC 或其他东西来做到这一点?
我的问题详细
我有一些针对内存数据库执行的集成测试。
真实数据库中有一个AView
视图,它在 Java 代码中映射为
@Entity @Table @Immutable
public class AView {}
我正在从 Hibernate 映射生成 H2 DB 模式以进行集成测试。在测试应用程序上下文初始化期间,这个视图被创建为一个表。从日志:
Hibernate: drop table AView if exists
Hibernate: create table AView (...)
一些测试因此而失败。
这个想法
为了解决这个问题,我想让 H2 DB 模式尽可能类似于真实的 DB 模式。首先,我想从 Hibernate 映射生成数据库模式,然后用视图替换AView
表。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 命令的方法。鉴于您希望仅针对测试执行此操作,将其放在测试根类路径中就足够了。
推荐阅读
- hybris - 使用导入脚本导入时媒体未正确导入
- r - 尝试使用 FAOSTAT 导入数据时出现 data.frame 错误
- django - Django:第 41 行的块标记无效:'endblock',预期为 'empty' 或 'endfor'
- machine-learning - 您如何准确计算卷积神经网络中过滤器的梯度?
- sql - Oracle 数据库中 DST 更改的时间似乎是凌晨 1 点而不是凌晨 2 点
- excel - 循环验证后如何发送带有字符串列表的电子邮件
- amazon-web-services - 静态路由配置问题
- python - 在 Python 中,如何指定参数是所有元素都具有相同类型的列表?
- multithreading - 如果线程数为 1,是空手道中的顺序运行还是并行运行
- python - 无法“pip3 install apex”导致无法构建加密(已安装)