Search code examples
javaspring-bootspring-data-jpahibernate-entitymanager

EntityManager doesn't translate camel case to snake case


I'm using SpringBoot 2.7.0 and trying to set an entity manager cause I have 2 databases.

But the entityManager that I instantiated doesn't work like default one.

  1. It doesn't translate camel case to snake case for the properties of entity when it creates tables.
  2. Even it doesn't follow the settings in application.yml. for example, spring.jpa.show-sql.

I configured it with below code.

@Slf4j
@RequiredArgsConstructor
@EnableJpaAuditing
@EnableJpaRepositories(basePackages = "com.xxx.yyy", entityManagerFactoryRef = "businessEntityManagerFactory", transactionManagerRef = "businessTransactionManager")
@EntityScan(basePackages = "com.xxx.yyy")
@Configuration
public class JpaConfiguration {

    @Bean
    public LocalContainerEntityManagerFactoryBean businessEntityManagerFactory(EntityManagerFactoryBuilder builder,
        DataSource businessDataSource) {
        return builder
            .dataSource(businessDataSource)
            .packages("com.xxx.yyy")
            .build();
    }

    @Bean
    public PlatformTransactionManager businessTransactionManager(LocalContainerEntityManagerFactoryBean businessEntityManagerFactory) {
        return new JpaTransactionManager(Objects.requireNonNull(businessEntityManagerFactory.getObject()));
    }
}

Does anyone know how I can instantiate an entity manager with same settings like spring boot default one?


Solution

  • Sven's answer might be right but I didn't try it because I saw this after I found the solution and it looked requiring many changes my codes.

    I figured this out with below codes

    @Bean
    public LocalContainerEntityManagerFactoryBean businessEntityManagerFactory(DataSource businessDataSource) {
        LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
        emf.setDataSource(businessDataSource);
        emf.setPackagesToScan("com.xxx.yyy");
    
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setShowSql(Boolean.valueOf(env.getProperty("spring.jpa.show-sql")));
        emf.setJpaVendorAdapter(vendorAdapter);
    
        HashMap<String, Object> properties = new HashMap<>();
        properties.put("hibernate.dialect", env.getProperty("spring.jpa.properties.hibernate.dialect"));
        properties.put("hibernate.format_sql", env.getProperty("spring.jpa.properties.hibernate.format_sql"));
        properties.put("hibernate.hbm2ddl.auto", env.getProperty("spring.jpa.properties.hibernate.hbm2ddl.auto"));
        properties.put("hibernate.physical_naming_strategy", "org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy");
        properties.put("hibernate.implicit_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy");
        emf.setJpaPropertyMap(properties);
    
        return emf;
    }