Springboo3 Jpa 配置多数据源数据库查询驼峰转换失效

425 阅读1分钟

Springboot 配置多数据源的文章网上一大把,但是大多都有一些问题。本次遇到的问题为查询驼峰转换失效。

经过实验,把正确的配置贴出来

// application.yml

spring:
   // ...   

  jpa:
    database: POSTGRESQL
    show-sql: true
    open-in-view: true
    properties:
      hibernate:
        physical_naming_strategy: org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
        enable_lazy_load_no_trans: true #使用延时加载时控制Session的生命周期
        dialect: org.hibernate.dialect.PostgreSQLDialect
        ddl-auto: update

    //....


@Configuration
@PropertySource({"classpath:application.yml"})
@EnableJpaRepositories(
        basePackages = "repository",
        entityManagerFactoryRef = "situationEntityManager",
        transactionManagerRef = "situationTransactionManager")
public class PersistenceSituationAutoConfiguration {

    private final JpaProperties jpaProperties;

    private final HibernateProperties hibernateProperties;

    private Map<String, Object> getVendorProperties() {
        return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings());
    }

    public PersistenceSituationAutoConfiguration(JpaProperties jpaProperties, HibernateProperties hibernateProperties) {
        this.jpaProperties = jpaProperties;
        this.hibernateProperties = hibernateProperties;
    }

    @Bean
    @Primary
    public DataSource situationDataSource(DataSourceProperties dataSourceProperties) {
        return dataSourceProperties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean situationEntityManager(EntityManagerFactoryBuilder builder, DataSource situationDataSource) {
        return builder.dataSource(situationDataSource)
                .packages("model") // 实体类的包
                .persistenceUnit("one") // 多数据源随便给个名
                .properties(getVendorProperties())
                .build();
    }

    @Bean
    public PlatformTransactionManager situationTransactionManager(LocalContainerEntityManagerFactoryBean situationEntityManager) {
        final JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(situationEntityManager.getObject());
        return transactionManager;
    }

}

参考的文章: