我想从Hibernate映射生成数据库模式,然后在应用程序启动之前用同名视图替换特定的表。
我怎么能用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数据库架构尽可能与真正的数据库架构相似。首先,我想从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 {}
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框架版本是4.1.9.RELEASE。
答案 0 :(得分:1)
您应该能够使用类路径根目录中的import.sql
文件作为在构建模式后让Hibernate执行一组SQL命令的方法。鉴于您希望仅针对测试执行此操作,将其置于测试根类路径中就足够了。