首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无ddl生成的Spring @DataJpaTest

无ddl生成的Spring @DataJpaTest
EN

Stack Overflow用户
提问于 2017-08-02 21:53:31
回答 2查看 3.7K关注 0票数 1

我有两个数据库中有表的MySQL,并且希望用SpringBoot (1.5.6.RELEASE)和JPA编写一个测试。为此,我将@DataJpaTest@EntityScan一起使用,因为实体位于两个不同的包中。作为测试的嵌入式数据库,我使用H2。

  1. 我的第一个问题是,Spring抛出了一个没有找到模式的异常,因此我创建了一个schema.sql,其中包含两个CREATE SCHEMA IF NOT EXISTS语句,如描述的在这个问题上
  2. 但是,我也想插入一些测试数据并添加一个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.sqldata.sql)而同时使用@DataJpaTest

非常感谢!

EN

回答 2

Stack Overflow用户

发布于 2017-08-03 04:31:01

解决方案1: properties/yaml文件

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
@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.properiesapplication.yaml应该在test/resources下,使用@Bean@Configuration类应该由测试使用。

通过sql-files进行测试时,可以使用EmbeddedDataSource

在我的github上有一些例子

票数 3
EN

Stack Overflow用户

发布于 2017-08-03 06:40:53

您可以在测试目录下创建另一个application.properties和配置文件。

对于其他问题,请在db创建后使用天桥脚本,这是您的插入脚本自动运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45471625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档