Eu tenho um aplicativo Spring Boot com dependência spring-boot-starter-data-jpa
. Minha classe de entidade possui uma anotação de coluna com um nome de coluna. Por exemplo:
@Column(name="TestName")
private String testName;
SQL gerado por isso criado test_name
como o nome das colunas. Depois de procurar uma solução, descobri que spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
resolveu o problema (o nome da coluna é obtido da anotação da coluna).
Ainda assim, minha pergunta é por que, sem naming_strategy definido como EJB3NamingStrategy
JPA, está ignorando a anotação da coluna? Talvez o dialeto de hibernação tenha algo a ver com isso? Estou conectando ao MS SQL 2014 Express e meus logs contêm:
Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect
Using dialect: org.hibernate.dialect.SQLServerDialect
java
hibernate
jpa
spring-boot
Kamil
fonte
fonte
@Column(name="...")
anotações, por exemplo, quando você usa outro tipo de acesso que não o esperado, mas esse não é o caso aqui.Respostas:
Para o hibernate5, resolvi esse problema colocando as próximas linhas no meu arquivo application.properties:
fonte
Por padrão, o Spring usa
org.springframework.boot.orm.jpa.SpringNamingStrategy
para gerar nomes de tabelas. Esta é uma extensão muito fina deorg.hibernate.cfg.ImprovedNamingStrategy
. OtableName
método nessa classe recebe umString
valor de origem, mas não se sabe se é proveniente de um@Column.name
atributo ou se foi gerado implicitamente a partir do nome do campo.O
ImprovedNamingStrategy
irá converterCamelCase
paraSNAKE_CASE
onde como oEJB3NamingStrategy
just usa o nome da tabela inalterado.Se você não quiser alterar a estratégia de nomenclatura, poderá sempre especificar o nome da coluna em minúsculas:
fonte
Parece que
é completamente ignorado, a menos que haja
especificado, então para mim isso é um bug.
Passei algumas horas tentando descobrir por que @Column (name = "..") foi ignorado.
fonte
A estratégia padrão para
@Column(name="TestName")
serátest_name
, este é o comportamento correto!Se você tiver uma coluna nomeada
TestName
em seu banco de dados, altere a anotação de Coluna para@Column(name="testname")
.Isso funciona porque o banco de dados não se importa se você nomear sua coluna TestName ou testname (os nomes das colunas não diferenciam maiúsculas de minúsculas !! ).
Mas cuidado, o mesmo não se aplica aos nomes de bancos de dados e tabelas, que diferenciam maiúsculas de minúsculas nos sistemas Unix, mas diferenciam maiúsculas de minúsculas nos sistemas Windows (o fato de que provavelmente manteve muitas pessoas acordadas à noite, trabalhando no Windows, mas implantando no Linux :))
fonte
A única solução que funcionou para mim foi a postada pelo teteArg acima. Estou no Spring Boot 1.4.2 com Hibernate 5. Ou seja
Para informações adicionais, eu estou postando o rastreamento de chamadas, para que fique claro o que as chamadas da Spring estão fazendo no Hibernate para configurar a estratégia de nomeação.
fonte
teteArg , muito obrigado. Apenas uma informação adicional, para que todos que se deparem com essa pergunta possam entender o porquê.
O que o teteArg disse está indicado nas Propriedades comuns da inicialização do Spring: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Aparentemente, spring.jpa.hibernate.naming.strategy não é uma propriedade suportada para a implementação da JPA do Spring usando o Hibernate 5.
fonte
Acontece que eu só tenho que converter o
@column
nome testName em todas as letras minúsculas, já que foi inicialmente em caixa de camelo.Embora eu não tenha conseguido usar a resposta oficial, a pergunta foi capaz de me ajudar a resolver meu problema, informando o que investigar.
Mudança:
Para:
fonte
Se você deseja usar @Column (...), use letras minúsculas sempre que sua coluna de banco de dados real esteja em caixa de camelo.
Exemplo: se o nome real da coluna do banco de dados for
TestName
, use:Se você não gostar disso, basta alterar o nome da coluna do banco de dados real para: test_name
fonte
No meu caso, a anotação estava no método getter () em vez do próprio campo (portado de um aplicativo herdado).
O Spring também ignora a anotação neste caso, mas não reclama. A solução foi movê-lo para o campo em vez do getter.
fonte