Hibernate ImprovedNamingStrategy不起作用

时间:2016-08-17 15:44:44

标签: java spring hibernate

我有一个数据库,其列使用snakecase命名,实体中包含camelcase中的列。该项目是使用 SELECT * FROM YourTable WHERE sessions % 5 = 0 编写的,并具有以下配置:

spring boot

这是application.properties内容:

    @Primary
    @Bean
    public LocalContainerEntityManagerFactoryBean mainEntityManagerFactory(
            @Qualifier("mainDataSource") DataSource mainDataSource,
            @Qualifier("mainJpaProperties") JpaProperties mainJpaProperties) {

        AbstractJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
        adapter.setShowSql(mainJpaProperties.isShowSql());
        adapter.setDatabase(mainJpaProperties.getDatabase());
        adapter.setDatabasePlatform(mainJpaProperties.getDatabasePlatform());
        adapter.setGenerateDdl(mainJpaProperties.isGenerateDdl());

        Map<String, Object> jpaProperties = new HashMap<>();
        jpaProperties.putAll(mainJpaProperties.getHibernateProperties(mainDataSource));
        jpaProperties.put("jpa.hibernate.naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringNamingStrategy");

        return new EntityManagerFactoryBuilder(adapter, mainJpaProperties, persistenceUnitManager)
                .dataSource(mainDataSource)
                .packages(Employee.class)
                .properties(jpaProperties)
                .persistenceUnit("main")
                .jta(false)
                .build();
    }

现在我无法使用spring boot并尝试转换配置:

jpa.hibernate.hbm2ddl.auto=none
jpa.hibernate.ddlAuto=none
jpa.hibernate.naming_strategy = org.springframework.boot.orm.jpa.hibernate.SpringNamingStrategy
jpa.generateDdl=false
jpa.showSql=false
jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL9Dialect

@Primary @Bean public LocalContainerEntityManagerFactoryBean mainEntityManagerFactory( @Qualifier("mainDataSource") DataSource mainDataSource ) { AbstractJpaVendorAdapter adapter = new HibernateJpaVendorAdapter(); adapter.setShowSql(Boolean.valueOf(environment.getProperty("jpa.showSql"))); adapter.setDatabase(Database.POSTGRESQL); adapter.setDatabasePlatform(environment.getProperty("jpa.hibernate.dialect")); adapter.setGenerateDdl(Boolean.valueOf(environment.getProperty("jpa.generateDdl"))); Properties jpaProperties = new Properties(); jpaProperties.put("jpa.hibernate.dialect", environment.getProperty("jpa.hibernate.dialect")); jpaProperties.put("hibernate.naming_strategy", "main.util.NamingStrategy"); LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean(); factoryBean.setDataSource(mainDataSource); factoryBean.setJpaVendorAdapter(adapter); factoryBean.setPersistenceUnitName("main"); factoryBean.setPersistenceUnitManager(persistenceUnitManager); factoryBean.setJpaProperties(jpaProperties); factoryBean.setPackagesToScan(packageToScan); factoryBean.afterPropertiesSet(); return factoryBean; } 只是main.util.NamingStrategy的复制品。

当我尝试运行它时,看起来这个命名策略不起作用,因为我收到错误:

org.springframework.boot.orm.jpa.hibernate.SpringNamingStrategy

如何在没有org.hibernate.AnnotationException: Unable to create unique key constraint (emp_address_id, year, yearNumber) on table employeedata: database column 'emp_address_id' not found. Make sure that you use the correct column name which depends on the naming strategy in use (it may not be the same as the property name in the entity, especially for relational types) 的情况下完成这项工作?

2 个答案:

答案 0 :(得分:2)

jpa.hibernate.naming_strategy属性键仅在Spring Boot的配置中使用。

当你自己配置hibernate时,你应该使用Hibernate属性。 Hibernate命名策略属性键的正确名称是 hibernate.ejb.naming_strategy

尝试在jpaProperties对象中替换它:

Properties jpaProperties = new Properties();
jpaProperties.put("hibernate.dialect", environment.getProperty("jpa.hibernate.dialect")); //jpa dialect property key is different too
jpaProperties.put("hibernate.ejb.naming_strategy", "main.util.NamingStrategy");

所有杂项属性列表:

https://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#configuration-misc-properties

我假设你只删除了Spring Boot,你仍在使用Hibernate 4.x(在Hibernate 5.x中,NamingStrategy被ImplicitNamingStrategy和PhysicalNamingStrategy取代)

对于hibernate 5.x,您应该使用org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNam‌​ingStrategy并默认使用Hibernate ImplicitNamingStrategy

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4-Release-Notes#naming-strategy

此物理命名策略的配置键为:hibernate.physical_naming_strategy

答案 1 :(得分:1)

只是明确地指出它(因为我不得不花一些时间从Maciej的答案中弄清楚),这对我来说适用于 Hibernate 5.x

properties.put("hibernate.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy");