Mam aplikację Spring Boot z zależnościami spring-boot-starter-data-jpa
. Moja klasa encji ma adnotację kolumny z nazwą kolumny. Na przykład:
@Column(name="TestName")
private String testName;
Kod SQL wygenerowany przez to utworzony test_name
jako nazwa kolumny. Po szukaniu rozwiązania stwierdziłem, że spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
problem rozwiązał (nazwa kolumny jest pobierana z adnotacji kolumny).
Mimo to moje pytanie brzmi: dlaczego bez ustawienia naming_strategy na EJB3NamingStrategy
JPA ignoruje adnotację kolumny? Może dialekt hibernacji ma z tym coś wspólnego? Łączę się z MS SQL 2014 Express i moje logi zawierają:
Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect
Using dialect: org.hibernate.dialect.SQLServerDialect
java
hibernate
jpa
spring-boot
Kamil
źródło
źródło
@Column(name="...")
adnotacje, na przykład gdy używasz innego niż oczekiwany typu dostępu, ale tak nie jest w tym przypadku.Odpowiedzi:
W przypadku hibernate5 problem rozwiązałem, umieszczając kolejne wiersze w moim pliku application.properties:
źródło
Domyślnie Spring używa
org.springframework.boot.orm.jpa.SpringNamingStrategy
do generowania nazw tabel. To jest bardzo cienkie rozszerzenieorg.hibernate.cfg.ImprovedNamingStrategy
. DotableName
metody w tej klasie jest przekazywanaString
wartość źródłowa, ale nie wiadomo, czy pochodzi ona z@Column.name
atrybutu, czy też została niejawnie wygenerowana na podstawie nazwy pola.ImprovedNamingStrategy
PrzekształciCamelCase
sięSNAKE_CASE
gdzie jakEJB3NamingStrategy
tylko używa nazwy tabeli niezmienione.Jeśli nie chcesz zmieniać strategii nazewnictwa, możesz zawsze podać nazwę kolumny małymi literami:
źródło
Wygląda na to że
jest całkowicie ignorowany, chyba że istnieje
określony, więc dla mnie jest to błąd.
Spędziłem kilka godzin, próbując dowiedzieć się, dlaczego @Column (name = "..") został zignorowany.
źródło
Domyślną strategią dla
@Column(name="TestName")
willtest_name
jest prawidłowe zachowanie!Jeśli masz kolumnę o nazwie
TestName
w swojej bazie danych, powinieneś zmienić Adnotację kolumny na@Column(name="testname")
.To działa, ponieważ baza danych nie dba o to, czy nazwiesz swoją kolumnę TestName czy testname (w nazwach kolumn nie jest rozróżniana wielkość liter !! ).
Ale uwaga, to samo nie dotyczy nazw baz danych i nazw tabel, które uwzględniają wielkość liter w systemach uniksowych, ale wielkość liter w systemach Windows (fakt, że prawdopodobnie wiele osób nie spało w nocy, pracując w systemie Windows, ale wdrażając na Linuksie :))
źródło
Jedynym rozwiązaniem, które zadziałało, było to opublikowane przez teteArg powyżej. Jestem na Spring Boot 1.4.2 z Hibernate 5. Mianowicie
Aby uzyskać dodatkowy wgląd, publikuję śledzenie połączeń, aby było jasne, co wywołuje Spring w Hibernate, aby skonfigurować strategię nazewnictwa.
źródło
teteArg , bardzo dziękuję. Tylko dodatkowa informacja, więc każdy, kto wpadnie na to pytanie, będzie mógł zrozumieć, dlaczego.
To, co powiedział teteArg , jest wskazane we wspólnych właściwościach Spring Boot: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Najwyraźniej spring.jpa.hibernate.naming.strategy nie jest obsługiwaną właściwością dla implementacji Spring JPA przy użyciu Hibernate 5.
źródło
Okazuje się, że muszę po prostu przekonwertować
@column
nazwę testName na wszystkie małe litery, ponieważ początkowo było to w przypadku wielbłąda.Chociaż nie byłem w stanie skorzystać z oficjalnej odpowiedzi, pytanie pomogło mi rozwiązać problem, dając mi znać, co mam zbadać.
Zmiana:
Do:
źródło
Jeśli chcesz używać @Column (...), używaj zawsze małych liter, nawet jeśli twoja rzeczywista kolumna DB jest w wielbłądzie.
Przykład: jeśli rzeczywista nazwa kolumny bazy danych to
TestName
:Jeśli ci się to nie podoba, po prostu zmień rzeczywistą nazwę kolumny DB na: nazwa_testu
źródło
W moim przypadku adnotacja znajdowała się w metodzie getter () zamiast w samym polu (przeniesionym ze starszej aplikacji).
Wiosna również w tym przypadku ignoruje adnotację, ale nie narzeka. Rozwiązaniem było przeniesienie go na pole zamiast do gettera.
źródło