mkyong example data conexion conectar application java mysql spring hibernate jpa

java - conexion - spring data jpa example mkyong



La estrategia de nombres de Hibernate cambia los nombres de la tabla (3)

Estoy un poco confundido por la estrategia de nombres hibernates (versión 5.1), es decir, cambia el nombre de mi tabla y me gustaría evitar eso. Además, spring.jpa.hibernate.naming_strategy parece estar obsoleto según intelij, pero no puedo encontrar una forma (o más) de configurarlo correctamente.

Tengo la siguiente configuración en application.properties:

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true spring.jpa.properties.hibernate.current_session_context_class=thread

El primero está marcado como depravado, como se dijo.

Ahora tengo una entidad:

@Entity @Table(name = "usaUploadTable", schema = "usertable201", catalog = "") public class UsaUploadTable { .... }

El nombre de la tabla es, como en @Table(name = "") usaUploadTable.

Ahora cuando ejecuto mi aplicación, obtengo

La tabla ''usertable201.usa_upload_table'' no existe

que es correcto, no se nombra como hibernación lo está cambiando.

¿Qué puedo hacer para que hibernate use el nombre de mi tabla correctamente?

Editar:

También intenté

DefaultNamingStrategy ImprovedNamingStrategy

Todos ellos lo cambian

Versiones:

spring-boot-1.4.0.RELEASE hibernate 5.1 javax-transaction-api 1.2 hibernate-validator 5.2.4 javassist 3.20


spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

funcionó para mí. aquí están las versiones que estoy usando:

Spring Boot (v1.4.2.RELEASE) Hibernate Core {5.0.11.Final}


El problema está en spring-boot-1.4. Parece que han cambiado las propiedades (o lo que sea). He encontrado esta respuesta. ImprovedNamingStrategy ya no funciona en Hibernate 5 , pero aún así no se resolvió correctamente. Así que SpringPhysicalNamingStrategy un poco el código para no utilizar el método de subrayado y para extender la nueva clase SpringPhysicalNamingStrategy :

package com.foo; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import java.io.Serializable; import java.util.Locale; public class RealNamingStrategyImpl extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable { public static final PhysicalNamingStrategyImpl INSTANCE = new PhysicalNamingStrategyImpl(); @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { return new Identifier(name.getText(), name.isQuoted()); } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { return new Identifier(name.getText(), name.isQuoted()); } }

Y en application.properties cambié la línea obsoleta a

spring.jpa.properties.hibernate.physical_naming_strategy=<package>.RealNamingStrategyImpl

Ahora usa exactamente los nombres de tabla y columna como los tengo en mis archivos de entidad.


Para quien quiere mayúsculas en Postgresql y Spring boot 1.5.2

public class CustomDatabaseIdentifierNamingStrategy extends org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy implements Serializable { public static final long serialVersionUID = 1L; public static final CustomDatabaseIdentifierNamingStrategy INSTANCE = new CustomDatabaseIdentifierNamingStrategy(); @Override public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) { return new Identifier(name.getText().toUpperCase(), true); } @Override public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) { return new Identifier(name.getText().toUpperCase(), true); } }