Autowired Spring数据存储库w/H2数据库处于测试中,未将实体表或字段转换为预期的Hibernate命名策略 问题
我有一个Spring配置类,用于生成内存中的H2数据库以进行集成测试。我还有一个集成测试,应该使用H2数据库来实现它的方法。其中一个测试,一个原始JDBC查询,成功了,所以我知道数据库至少部分是由脚本生成的。但是,JPA实体(假定其名为SampleThing并具有相应的SampleThingRepository)在生成SQL时似乎没有使用正确的命名策略 在文件IntegrationConfigTest中,我定义了两个测试:Autowired Spring数据存储库w/H2数据库处于测试中,未将实体表或字段转换为预期的Hibernate命名策略 问题,spring,hibernate,spring-data,spring-data-jpa,h2,Spring,Hibernate,Spring Data,Spring Data Jpa,H2,我有一个Spring配置类,用于生成内存中的H2数据库以进行集成测试。我还有一个集成测试,应该使用H2数据库来实现它的方法。其中一个测试,一个原始JDBC查询,成功了,所以我知道数据库至少部分是由脚本生成的。但是,JPA实体(假定其名为SampleThing并具有相应的SampleThingRepository)在生成SQL时似乎没有使用正确的命名策略 在文件IntegrationConfigTest中,我定义了两个测试: IntegrationConfigTest.verifyEmbedde
- IntegrationConfigTest.verifyEmbeddedDatabase(通过)
- IntegrationConfigTest.ormMappingShouldWork(失败,出现异常org.h2.jdbc.JdbcSQLException:未找到表“sampleThings;”)
- 我期望存储库方法findOne(1L)为SQL生成什么:
- 选择samplethin0\u0.id作为id1\u 6\u 0\u0,samplethin0.is\u active as\u active2\u 6\u 0\u0,samplethin0.name作为name3\u 6\u 0\u0,samplethin0.list\u order作为testDb.samplethin中的list\u4\u 6\u 0\u0\u0,其中samplethin\u0.id=
- 它实际上产生了什么:
- 从testDb.sampleThings sampleThings中选择samplethin0.id作为id1_6_0_,samplethin0.isActive作为isActive2_6_0_,samplethin0.name作为name3_6_0_,samplethin0_。listOrder作为ListOrder4_6_0_
@Ignore("Not a test")
@Configuration
@EnableJpaRepositories("com.company.project.repository")
public class IntegrationConfig {
@Value("classpath:checks_off.sql")
private Resource checksOffScript;
@Value("classpath:set_mode.sql")
private Resource setModeScript;
@Value("classpath:test_schema.sql")
private Resource schemaScript;
@Value("classpath:test_import.sql")
private Resource importScript;
@Value("classpath:checks_on.sql")
private Resource checksOnScript;
@Bean
public DataSource dataSource() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.url("jdbc:h2:mem:testDb;DB_CLOSE_DELAY=-1;MODE=Mysql;DATABASE_TO_UPPER=false");
dataSourceBuilder.driverClassName("org.h2.Driver");
return dataSourceBuilder.build();
}
@Bean
public DataSourceInitializer dataSourceInitializer() {
final DataSourceInitializer initializer = new DataSourceInitializer();
initializer.setDataSource(dataSource());
initializer.setDatabasePopulator(databasePopulator());
return initializer;
}
private DatabasePopulator databasePopulator() {
final ResourceDatabasePopulator populator = new ResourceDatabasePopulator();
populator.addScript(checksOffScript);
populator.addScript(setModeScript);
populator.addScript(schemaScript);
populator.addScript(importScript);
populator.addScript(checksOnScript);
return populator;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setDataSource(dataSource());
entityManagerFactoryBean.setPackagesToScan("com.company.project");
entityManagerFactoryBean.setJpaProperties(getPropeties());
entityManagerFactoryBean.setJpaVendorAdapter(getJpaVendorAdapter());
return entityManagerFactoryBean;
}
private Properties getPropeties(){
Properties properties = new Properties();
properties.put("hibernate.current_session_context_class", SpringSessionContext.class.getName());
properties.put("hibernate.default_schema", "testDb");
properties.put("hibernate.naming_strategy", org.hibernate.cfg.ImprovedNamingStrategy.class.getName());
return properties;
}
private JpaVendorAdapter getJpaVendorAdapter(){
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabase(Database.H2);
adapter.setGenerateDdl(true);
adapter.setShowSql(true);
return adapter;
}
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
return transactionManager;
}
}
下面是IntegrationConfigTest,该类包含两个测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = IntegrationConfig.class)
public class IntegrationConfigTest {
JdbcTemplate jdbcTemplate;
@Autowired
SampleThingRepository sampleThingRepository;
@Autowired
DataSource dataSource;
@Before
public void setUp() {
jdbcTemplate = new JdbcTemplate(dataSource);
}
String getThingByOrder(int order) {
return jdbcTemplate.queryForObject(
"SELECT name FROM sample_things WHERE list_order = ?",
String.class, order);
}
@Test
public void verifyEmbeddedDatabase() {
String firstThing = getThingByOrder(1);
assertThat(firstThing, is("This thing"));
String secondThing = getThingByOrder(2);
assertThat(secondThing, is("That thing"));
}
@Test
public void ormMappingShouldWork() {
SampleThing sampleThing = sampleThingRepository.findOne(1L);
assertThat(sampleThing.getName(), is("This thing"));
assertThat(sampleThing.getOrder(), is(1));
}
}
似乎没有应用您的
NamingStrategy
。将hibernate.naming_策略
更改为hibernate.ejb.naming_策略
,使您的hibernate属性如下所示:
properties.put("hibernate.ejb.naming_strategy", org.hibernate.cfg.ImprovedNamingStrategy.class.getName());
似乎没有应用您的
NamingStrategy
。将hibernate.naming_策略
更改为hibernate.ejb.naming_策略
,使您的hibernate属性如下所示:
properties.put("hibernate.ejb.naming_strategy", org.hibernate.cfg.ImprovedNamingStrategy.class.getName());