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);
}
}