hibernate Sping Boot -对自定义数据源使用带下划线的表名和列名

ruarlubt  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(135)

我正在尝试为一个Sping Boot 项目配置两个数据源。下面是我的主数据源配置文件。

@PropertySource({"classpath:application-local.properties"})
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "primaryEntityManager",
        basePackages = {"portal.api.repository"}
)
public class PrimaryDbConfig {

    @Autowired
    private Environment env;

    @Bean
    @Primary
    public LocalContainerEntityManagerFactoryBean primaryEntityManager() {
        LocalContainerEntityManagerFactoryBean em
                = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(primaryDataSource());
        em.setPackagesToScan(
                new String[]{"portal.api.model"});

        HibernateJpaVendorAdapter vendorAdapter
                = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        HashMap<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl.auto",
                env.getProperty("app.datasource.spring.jpa.hibernate.ddl"));
        properties.put("hibernate.dialect",
                env.getProperty("hibernate.dialect"));
        em.setJpaPropertyMap(properties);

        return em;
    }

    @Primary
    @Bean
    public DataSource primaryDataSource() {

        DriverManagerDataSource dataSource
                = new DriverManagerDataSource();
        dataSource.setDriverClassName(
                env.getProperty("app.datasource.driver-class-name"));
        dataSource.setUrl(env.getProperty("app.datasource.url"));
        dataSource.setUsername(env.getProperty("app.datasource.username"));
        dataSource.setPassword(env.getProperty("app.datasource.password"));

        return dataSource;
    }

    @Primary
    @Bean
    public PlatformTransactionManager userTransactionManager() {

        JpaTransactionManager transactionManager
                = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(
                primaryEntityManager().getObject());
        return transactionManager;
    }

}

生成了表,但是它们的名称和列名称是驼峰式的。但是我希望使用spring Boot 默认使用的下划线名称。例如,ApiKey实体将更改为表名api_key
如何配置Sping Boot 以使用带下划线的命名策略?

i2byvkas

i2byvkas1#

我认为如果您在域模型的示例变量中使用@Column(name =“API_key”),它将工作。
例如:

@Column(name = "api_key")
    private String apiKey;
6qftjkof

6qftjkof2#

来自Official doc的参考
默认情况下,Spring Boot使用SpringPhysicalNamingStrategy配置物理命名策略,该实现提供了与Hibernate 4相同的表结构:所有点都被下划线替换,并且驼峰式大小写也被下划线替换。
您可以在application.yml中设置以下属性来告诉springboot使用哪种命名策略:

spring:
  jpa:
    hibernate:
      naming:
        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

类似岗位参考:java. sql. sql语法错误异常:未知列。JPA实体问题?

相关问题