我有两个数据库中有表的MySQL,并且希望用SpringBoot (1.5.6.RELEASE)和JPA编写一个测试。为此,我将@DataJpaTest与@EntityScan一起使用,因为实体位于两个不同的包中。作为测试的嵌入式数据库,我使用H2。
schema.sql,其中包含两个CREATE SCHEMA IF NOT EXISTS语句,如描述的在这个问题上。data.sql文件。现在的问题是,Spring首先执行了schema.sql,然后执行了data.sql,接着Hibernate再次创建了表,最终导致了空表。为了解决这个问题,我尝试在spring.jpa.hibernate.ddl-auto=none中设置application.properties。然而,Hibernate现在开始切换命名策略,并将camelCase转换为sneak_case,这再次导致错误。所以我想,这不是该怎么做的。我也尝试过spring.jpa.generate-ddl=false,但这没有任何效果。如何使DDL自动生成(只使用schema.sql和data.sql)而同时使用@DataJpaTest
非常感谢!
发布于 2017-08-03 04:31:01
解决方案1: properties/yaml文件
spring:
autoconfigure:
exclude: org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration
jackson:
serialization:
indent_output: true
datasource:
driver-class-name: org.hsqldb.jdbcDriver
generate-unique-name: true
jpa:
hibernate:
ddl-auto: none
show-sql: true
h2:
console:
enabled: false
liquibase:
change-log: classpath:/liquibase/db.changelog-master.xml
drop-first: true
contexts: QA解决方案2:覆盖@Bean
@Bean
LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, Environment env) {
final LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setDataSource(dataSource);
factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factory.setPackagesToScan("com.spring.web.demo.persistent.entity");
factory.setJpaProperties(jpaProperties(env));
return factory;
}
private Properties jpaProperties(Environment env) {
final Properties properties = new Properties();
properties.put("hibernate.dialect", env.getRequiredProperty("hibernate.dialect"));
//!!!: see here
properties.put("hibernate.hbm2ddl.auto", "none");
properties.put("hibernate.show_sql", env.getRequiredProperty("hibernate.show_sql"));
properties.put("hibernate.format_sql", false);
properties.put("hibernate.physical_naming_strategy", PhysicalNamingStrategyStandardImpl.class.getName());
properties.put("hibernate.generate_statistics", true);
properties.put("hibernate.cache.use_second_level_cache", true);
properties.put("hibernate.cache.use_query_cache", true);
properties.put("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory");
return properties;
}注意,application.properies或application.yaml应该在test/resources下,使用@Bean的@Configuration类应该由测试使用。
通过sql-files进行测试时,可以使用EmbeddedDataSource
在我的github上有一些例子
发布于 2017-08-03 06:40:53
您可以在测试目录下创建另一个application.properties和配置文件。
对于其他问题,请在db创建后使用天桥脚本,这是您的插入脚本自动运行。
https://stackoverflow.com/questions/45471625
复制相似问题