spring – hibernación 5 configuración de la estrategia de nombres

Estoy escribiendo aplicaciones usando la base de datos postgresql y frameworks spring + hibernate.

Actualicé Spring Framework de 4.1.5.RELEASE a 4.2.0.RELEASE y actualicé hibernate framework de 4.3.7.Final a 5.0.0.Final version.

Después de la actualización, tengo problemas con NamingStrategy. En la base de datos postgresql, los nombres de columna de la tabla están en minúscula separados por guion bajo, en la capa de aplicación, las propiedades de frijol están en camelcase.

Este es el archivo de configuración de spring en funcionamiento para la versión anterior:

                      fms                      

Después de la actualización, cambié la configuración de NamingStrategy:

  

Me gusta esto:

  

e intenté todas las variantes de opciones enumeradas en hibernate javadoc: https://docs.jboss.org/hibernate/orm/5.0/javadocs/org/hibernate/cfg/AvailableSettings.html#IMPLICIT_NAMING_STRATEGY

pero sin éxito

¿Puede decirme cuál es la alternativa de ImprovedNamingStrategy en Hibernate 5 y proporcionar un ejemplo de configuración de trabajo?

Creo que encontré la solución.

Para lograr mi objective, utilicé la configuración hibernate.physical_naming_strategy , en lugar de hibernate.implicit_naming_strategy .

Creé una implementación de la interfaz PhysicalNamingStrategy que simula parte de la funcionalidad de la clase original ImprovedNamingStrategy :

 package fms.util.hibernate; import org.apache.commons.lang.StringUtils; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategy; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; public class ImprovedNamingStrategy implements PhysicalNamingStrategy { @Override public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnv) { return convert(identifier); } @Override public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnv) { return convert(identifier); } @Override public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnv) { return convert(identifier); } @Override public Identifier toPhysicalSequenceName(Identifier identifier, JdbcEnvironment jdbcEnv) { return convert(identifier); } @Override public Identifier toPhysicalTableName(Identifier identifier, JdbcEnvironment jdbcEnv) { return convert(identifier); } private Identifier convert(Identifier identifier) { if (identifier == null || StringUtils.isBlank(identifier.getText())) { return identifier; } String regex = "([az])([AZ])"; String replacement = "$1_$2"; String newName = identifier.getText().replaceAll(regex, replacement).toLowerCase(); return Identifier.toIdentifier(newName); } } 

Después de crear esta clase, cambié mi configuración de:

  

a esto:

  

y ahora todo funciona correctamente

Esta solución cubre solo una pequeña parte de ImprovedNamingStrategy . En mi proyecto, para mapeo de tablas y mapeo de unión, siempre especifico explícitamente el nombre de la tabla o la columna de unión. Confío en la conversión de nombre implícito solo para los nombres de columna. Entonces esta solución simple fue aceptable para mí.

Este es un ejemplo completo de mi archivo de configuración Spring:

                       fms                      

Espero que esta solución sea útil para alguien. 🙂

este trabajo para mí, de http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/hibernate5/LocalSessionFactoryBean.html

  /*convet aaBb to aa_bb*/    /*convet aa_bb to aaBb*/    

Tuve exactamente el mismo problema. Lo arreglé con la implementación predeterminada desde el arranque de spring:

   

Para cualquiera que busque una solución de configuración Java

La propiedad hibernate.ejb.naming_strategy parece dividida en dos partes en hibernate 5.X:

hibernate.physical_naming_strategy

hibernate.implicit_naming_strategy

Spring proporciona SpringImplicitNamingStrategy y SpringPhysicalNamingStrategy para este fin.

Aquí está mi enfoque:

 import javax.persistence.EntityManagerFactory; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy; import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.DependsOn; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @DependsOn("myDataSource") @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "myEntityManagerFactory", basePackages={"com.myapp.repo"}, transactionManagerRef="myTransactionManager" ) public class MyJpaConfig { private Map properties; public MyJpaConfig() { properties = new HashMap<>(); properties.put("hibernate.implicit_naming_strategy", SpringImplicitNamingStrategy.class.getName()); properties.put("hibernate.physical_naming_strategy", SpringPhysicalNamingStrategy.class.getName()); } @Bean(name = "myEntityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder, @Qualifier("systemDataSource") DataSource dataSource) { LocalContainerEntityManagerFactoryBean build = builder.dataSource(dataSource) .packages("com.myapp.entity") .properties(properties) .build(); return build; } @Bean(name = "myTransactionManager") public PlatformTransactionManager myTransactionManager( @Qualifier("myEntityManagerFactory") EntityManagerFactory myEntityManagerFactory) { return new JpaTransactionManager(myEntityManagerFactory); } } 

prueba esto:

 @Bean public LocalSessionFactoryBean getSessionFactory() { LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean(); localSessionFactoryBean.setDataSource(getDataSource()); localSessionFactoryBean.setHibernateProperties(getHibernateProperties()); localSessionFactoryBean.setPackagesToScan(new String[]{"com.xxx.pojo"}); // -----important----- localSessionFactoryBean.setPhysicalNamingStrategy(new CustomNamingStrategy()); return localSessionFactoryBean; } public class CustomNamingStrategy extends PhysicalNamingStrategyStandardImpl {*** 

Configuración de Full Spring que funciona para mí:

            org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl ${hibernate.format_sql:false} ${hibernate.hbm2ddl.auto:validate} ${hibernate.show_sql:false} ${hibernate.use_sql_comments:false} ${hibernate.id.new_generator_mappings:true} ${hibernate.enable_lazy_load_no_trans:true} ${hibernate.max_fetch_depth:1} ${hibernate.default_batch_fetch_size:16}