Tengo una aplicación Spring Boot con dependencia spring-boot-starter-data-jpa
. Mi clase de entidad tiene una anotación de columna con un nombre de columna. Por ejemplo:
@Column(name="TestName")
private String testName;
SQL generado por esto creado test_name
como el nombre de las columnas. Después de buscar una solución, encontré que spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
resolvió el problema (el nombre de la columna se toma de la anotación de la columna).
Aún así, mi pregunta es ¿por qué sin naming_strategy establecido en EJB3NamingStrategy
JPA se ignora la anotación de columna? ¿Quizás el dialecto de hibernación tenga algo que ver con eso? Me estoy conectando a MS SQL 2014 Express y mis registros contienen:
Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect
Using dialect: org.hibernate.dialect.SQLServerDialect
java
hibernate
jpa
spring-boot
Kamil
fuente
fuente
@Column(name="...")
anotación, por ejemplo, cuando usa un tipo de acceso diferente al esperado, pero ese no es el caso aquí.Respuestas:
Para hibernate5 resolví este problema colocando las siguientes líneas en mi archivo application.properties:
fuente
Por defecto, Spring usa
org.springframework.boot.orm.jpa.SpringNamingStrategy
para generar nombres de tablas. Esta es una extensión muy delgada deorg.hibernate.cfg.ImprovedNamingStrategy
. AltableName
método de esa clase se le pasa unString
valor fuente , pero no sabe si proviene de un@Column.name
atributo o si se ha generado implícitamente a partir del nombre del campo.El
ImprovedNamingStrategy
se convertiráCamelCase
aSNAKE_CASE
donde, ya queEJB3NamingStrategy
solo usa el nombre de la tabla sin cambios.Si no desea cambiar la estrategia de nomenclatura, siempre puede especificar el nombre de su columna en minúsculas:
fuente
Parece que
se ignora por completo a menos que haya
especificado, entonces para mí esto es un error.
Pasé algunas horas tratando de averiguar por qué se ignoró @Column (name = "..").
fuente
La estrategia predeterminada para
@Column(name="TestName")
serátest_name
, ¡este es el comportamiento correcto!Si tiene una columna nombrada
TestName
en su base de datos, debe cambiar la anotación de columna a@Column(name="testname")
.Esto funciona porque a la base de datos no le importa si nombra su columna TestName o testname (los nombres de las columnas no distinguen entre mayúsculas y minúsculas !! ).
Pero cuidado, no se aplica lo mismo para el nombre de la base de datos y los nombres de las tablas, que distinguen entre mayúsculas y minúsculas en los sistemas Unix pero sí en los sistemas Windows (el hecho de que probablemente mantuvo a mucha gente despierta por la noche, trabajando en Windows pero desplegando en Linux :))
fuente
La única solución que funcionó para mí fue la publicada por teteArg arriba. Estoy en Spring Boot 1.4.2 con Hibernate 5. A saber
Para obtener información adicional, estoy publicando el seguimiento de llamadas para que quede claro qué llamadas está haciendo Spring en Hibernate para configurar la estrategia de nombres.
fuente
teteArg , muchas gracias. Solo una información adicional para que todos los que se encuentren con esta pregunta podrán entender por qué.
Lo que dijo teteArg se indica en las propiedades comunes de Spring Boot: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Aparentemente, spring.jpa.hibernate.naming.strategy no es una propiedad compatible para la implementación de Spring JPA usando Hibernate 5.
fuente
Resulta que solo tengo que convertir el
@column
nombre testName a todas las letras minúsculas, ya que inicialmente estaba en caja camel.Aunque no pude usar la respuesta oficial, la pregunta pudo ayudarme a resolver mi problema al permitirme saber qué investigar.
Cambio:
A:
fuente
Si desea usar @Column (...), use letras en minúsculas siempre, aunque su columna DB real esté en camel-case.
Ejemplo: si su nombre de columna de base de datos real es
TestName
, utilice:Si no le gusta eso, simplemente cambie el nombre real de la columna de la base de datos a: test_name
fuente
En mi caso, la anotación estaba en el método getter () en lugar del campo en sí (portado desde una aplicación heredada).
Spring también ignora la anotación en este caso, pero no se queja. La solución fue moverlo al campo en lugar del getter.
fuente