Autowired Spring数据存储库w/H2数据库处于测试中,未将实体表或字段转换为预期的Hibernate命名策略 问题

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

我有一个Spring配置类,用于生成内存中的H2数据库以进行集成测试。我还有一个集成测试,应该使用H2数据库来实现它的方法。其中一个测试,一个原始JDBC查询,成功了,所以我知道数据库至少部分是由脚本生成的。但是,JPA实体(假定其名为SampleThing并具有相应的SampleThingRepository)在生成SQL时似乎没有使用正确的命名策略

在文件IntegrationConfigTest中,我定义了两个测试:

  • 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_
在IntegrationConfig中,我将hibernate.naming_策略定义为改进的命名策略(这正是我想要的)。您可以假设我的实体样本指定了一个表名和列名,以驼峰形式表示,应该将其转换为snake形式。任何帮助都将不胜感激

文件夹 下面是IntegrationConfig,我的配置设置H2数据库:

@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());