java - enablejparepositories - spring data rest




Spring Boot+JPA: annotazione del nome della colonna ignorata (6)

Ho un'applicazione Spring Boot con dipendenza "spring-boot-starter-data-jpa". La mia classe di entità ha un'annotazione di colonna con nome di colonna. Per esempio:

@Column(name="TestName")
private String testName;

SQL generato da questo nome test creato come nome colonna. Dopo aver cercato la soluzione, ho trovato che spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy risolto il problema (il nome della colonna è preso dall'annotazione della colonna).

Tuttavia, la mia domanda è: perché senza naming_strategy impostato su EJB3NamingStrategy JPA sta ignorando l'annotazione della colonna? Forse il dialetto in letargo ha qualcosa a che fare con esso? Mi sto collegando a MS SQL 2014 Express e i miei registri contengono:

Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect
Using dialect: org.hibernate.dialect.SQLServerDialect 


L'unica cosa che ha funzionato per me era avere entrambe le righe di codice come postate sopra:

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

Avere solo la linea singola proposta da ncaralicea non ha funzionato per me


La strategia predefinita per @Column(name="TestName") sarà test_name , questo è il comportamento corretto!

Se nel database è presente una colonna denominata TestName è necessario modificare l'annotazione della colonna in @Column(name="testname") .

Funziona perché al database non interessa se si assegna un nome alla colonna TestName o testname (i nomi delle colonne sono case insensitive !! ).

Ma attenzione, lo stesso non si applica ai nomi di database e nomi di tabelle, che fanno distinzione tra maiuscole e minuscole su sistemi Unix ma case sensitive su sistemi Windows (il fatto che probabilmente teneva molte persone sveglie di notte, lavorando su Windows ma distribuendo su Linux :))


Per hibernate5 ho risolto questo problema inserendo le righe seguenti nel mio file application.properties:

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

Se si desidera utilizzare @Column (...), utilizzare sempre lettere minuscole anche se la colonna DB attuale è in caso cammello.

Esempio: se il nome effettivo della colonna DB è: TestName, utilizzare:

  @Colunm(name="testname") //all small-case

Se non ti piace, cambia semplicemente il nome effettivo della colonna DB in: test_name


Sembra che

@Column (name = "..")

è completamente ignorato a meno che non ci sia

spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.EJB3NamingStrategy

specificato, quindi per me questo è un bug.

Ho passato alcune ore a cercare di capire perché @Column (name = "..") è stato ignorato.





spring-boot