Java Spring Boot@DataJpaTest,不生成ddl
我有两个数据库中带有表的MySQL,我想用SpringBoot 1.5.6.RELEASE和JPA编写一个测试。为此,我将@DataJpaTest与@EntityScan一起使用,因为实体位于两个不同的包中。作为测试的嵌入式数据库,我使用H2 我的第一个问题是,SpringBoot抛出了一个异常,即找不到模式,因此我创建了一个schema.sql,其中包含两个CREATESCHEMA IF not EXISTS语句,如所述。 但是,我还想插入一些测试数据并添加一个data.sql文件。现在的问题是,Spring boot首先执行schema.sql,然后执行data.sql,然后再执行Hibernate创建表,最终导致空表。为了解决这个问题,我尝试在application.properties中设置spring.jpa.hibernate.ddl auto=none。然而,Hibernate现在开始切换命名策略,并将camelCase转换为sleek_case,这再次导致了错误。所以我想,这不是应该怎么做的。我还尝试了spring.jpa.generateddl=false,但没有任何效果。 如何仅使用schema.sql和data.sql并同时使用@DataJpaTest停用自动DDL生成 多谢各位 解决方案1:属性/yaml文件 解决方案2:重写@Bean 注意,application.properies或application.yaml应该在test/resources下,测试应该使用带有@Bean的@Configuration类 用于通过sql文件进行测试,您可以使用 我的解决方案1:properties/yaml文件中有一些示例 解决方案2:重写@Bean 注意,application.properies或application.yaml应该在test/resources下,测试应该使用带有@Bean的@Configuration类 用于通过sql文件进行测试,您可以使用Java Spring Boot@DataJpaTest,不生成ddl,java,hibernate,unit-testing,spring-boot,spring-data-jpa,Java,Hibernate,Unit Testing,Spring Boot,Spring Data Jpa,我有两个数据库中带有表的MySQL,我想用SpringBoot 1.5.6.RELEASE和JPA编写一个测试。为此,我将@DataJpaTest与@EntityScan一起使用,因为实体位于两个不同的包中。作为测试的嵌入式数据库,我使用H2 我的第一个问题是,SpringBoot抛出了一个异常,即找不到模式,因此我创建了一个schema.sql,其中包含两个CREATESCHEMA IF not EXISTS语句,如所述。 但是,我还想插入一些测试数据并添加一个data.sql文件。现在的问题
在my中有一些示例,您可以创建另一个application.properties并在测试目录下为其配置文件
对于其他问题,请在数据库创建后使用flyway flyway脚本,这是您的插入脚本自动运行。您可以在测试目录下创建另一个application.properties并配置文件
对于其他问题,请在数据库创建后使用flyway flyway脚本,该脚本是您的插入脚本,将自动运行。谢谢您的回答。正如我在问题中提到的,设置ddl auto=none不起作用。你的第三个解决方案不是我的问题的目的。然而,我发现将spring.jpa.hibernate.naming.physical strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl添加到``ddl auto=none`中似乎是一种可以接受的解决方法。如果你相应地改变了你的第一个和第二个答案,我可以把它标记为接受答案。不幸的是,您的github链接没有帮助,您可以提供更具体的链接吗?非常感谢。将GitHub链接更改为测试存储库示例。您的答案仍然与我的问题不对应。我既不使用liquibase也不使用HSQLDB,您的描述解决方案对我不起作用。有效的解决方法是设置spring.jpa.hibernate.naming.physical strategy=org.hibernate。boot.model.naming.Ph物理模拟策略StandardImpl和ddl auto=none谢谢您的回答。正如我在问题中提到的,设置ddl auto=none不起作用。你的第三个解决方案不是我的问题的目的。然而,我发现将spring.jpa.hibernate.naming.physical strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl添加到``ddl auto=none`中似乎是一种可以接受的解决方法。如果你相应地改变了你的第一个和第二个答案,我可以把它标记为接受答案。不幸的是,您的github链接没有帮助,您可以提供更具体的链接吗?非常感谢。将GitHub链接更改为测试存储库示例。您的答案仍然与我的问题不对应。我既不使用liquibase也不使用HSQLDB,您的描述解决方案对我不起作用。有效的解决方法是设置spring.jpa.hibernate.naming.physical strategy=org.hibernate。boot.model.naming.Ph物理模拟策略StandardImpl和ddl auto=NONE我的测试目录中有一个application.properties文件,我应该如何配置它?您能否更具体地说明如何让flyway与@DataJpaTest协同工作?您可以添加依赖项,也可以添加插件,当您创建一次dbS时,导出创建脚本并填充flyway文件扩展名为.sql。在创建脚本下面添加插入脚本,并设置hibernate ddl auto:none或false此脚本文件在应用程序启动之前运行,并且您的db将在我的测试目录中具有application.properties文件,我应该如何配置它?您能否更具体地说明如何让flyway与@DataJpaTest协同工作?您可以添加依赖项,也可以添加插件,当您创建一次dbS时,导出创建脚本并填充flyway 文件的扩展名已经是.sql。在创建脚本下面,添加插入脚本,并设置hibernate ddl auto:none或false。此脚本文件在应用程序启动之前运行,数据库准备就绪
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
@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;
}