Ich habe eine Spring Boot-Anwendung mit Abhängigkeit spring-boot-starter-data-jpa
. Meine Entitätsklasse hat eine Spaltenanmerkung mit einem Spaltennamen. Beispielsweise:
@Column(name="TestName")
private String testName;
SQL, das dadurch generiert wird, wird test_name
als Spaltenname erstellt. Nachdem ich nach einer Lösung gesucht habe, habe ich festgestellt, dass spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
das Problem behoben ist (der Spaltenname stammt aus der Spaltenanmerkung).
Meine Frage ist jedoch, warum ohne die auf EJB3NamingStrategy
JPA gesetzte Namensstrategie die Spaltenanmerkung ignoriert wird. Vielleicht hat der Dialekt im Winterschlaf etwas damit zu tun? Ich stelle eine Verbindung zu MS SQL 2014 Express her und meine Protokolle enthalten:
Unknown Microsoft SQL Server major version [12] using SQL Server 2000 dialect
Using dialect: org.hibernate.dialect.SQLServerDialect
java
hibernate
jpa
spring-boot
Kamil
quelle
quelle
@Column(name="...")
Anmerkungen möglicherweise ignoriert , z. B. wenn Sie einen anderen als den erwarteten Zugriffstyp verwenden. Dies ist hier jedoch nicht der Fall.Antworten:
Für den Ruhezustand5 habe ich dieses Problem gelöst, indem ich die nächsten Zeilen in meine Datei application.properties eingefügt habe:
quelle
Standardmäßig
org.springframework.boot.orm.jpa.SpringNamingStrategy
generiert Spring Tabellennamen. Dies ist eine sehr dünne Erweiterung vonorg.hibernate.cfg.ImprovedNamingStrategy
. DertableName
Methode in dieser Klasse wird einString
Quellwert übergeben, es ist jedoch nicht bekannt, ob sie von einem@Column.name
Attribut stammt oder implizit aus dem Feldnamen generiert wurde.Das
ImprovedNamingStrategy
wirdCamelCase
inSNAKE_CASE
where konvertiert , da derEJB3NamingStrategy
gerade den Tabellennamen unverändert verwendet.Wenn Sie die Namensstrategie nicht ändern möchten, können Sie Ihren Spaltennamen immer in Kleinbuchstaben angeben:
quelle
Es scheint, dass
wird vollständig ignoriert, es sei denn
angegeben, also für mich ist dies ein Fehler.
Ich habe ein paar Stunden damit verbracht herauszufinden, warum @Column (name = "..") ignoriert wurde.
quelle
Die Standardstrategie für
@Column(name="TestName")
wird seintest_name
, dies ist korrektes Verhalten!Wenn
TestName
Ihre Datenbank eine Spalte mit dem Namen enthält , sollten Sie die Spaltenanmerkung in ändern@Column(name="testname")
.Dies funktioniert, da es der Datenbank egal ist, ob Sie Ihre Spalte Testname oder Testname benennen ( Spaltennamen unterscheiden nicht zwischen Groß- und Kleinschreibung !! ).
Beachten Sie jedoch, dass dies nicht für Datenbanknamen und Tabellennamen gilt, bei denen auf Unix-Systemen zwischen Groß- und Kleinschreibung unterschieden wird, auf Windows-Systemen jedoch zwischen Groß- und Kleinschreibung (die Tatsache, dass wahrscheinlich viele Leute nachts wach gehalten haben, unter Windows gearbeitet haben, aber unter Linux bereitgestellt wurden :))
quelle
Die einzige Lösung, die für mich funktioniert hat, war die von teteArg oben. Ich bin auf Spring Boot 1.4.2 mit Ruhezustand 5. Nämlich
Für zusätzliche Informationen veröffentliche ich die Anrufverfolgung, damit klar ist, welche Anrufe Spring in den Ruhezustand tätigt, um die Namensstrategie einzurichten.
quelle
teteArg , vielen Dank. Nur eine zusätzliche Information, damit jeder, der auf diese Frage stößt, verstehen kann, warum.
Was teteArg sagte, wird in den allgemeinen Eigenschaften von Spring Boot angegeben: http://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html
Anscheinend ist spring.jpa.hibernate.naming.strategy keine unterstützte Eigenschaft für die Spring JPA-Implementierung mit Hibernate 5.
quelle
Es stellt sich heraus, dass ich nur den
@column
Namen testName in alle kleinen Buchstaben konvertieren muss, da es sich ursprünglich um einen Kamelfall handelte.Obwohl ich die offizielle Antwort nicht verwenden konnte, konnte mir die Frage helfen, mein Problem zu lösen, indem sie mir mitteilte, was ich untersuchen sollte.
Veränderung:
Zu:
quelle
Wenn Sie @Column (...) verwenden möchten, verwenden Sie immer Kleinbuchstaben, obwohl sich Ihre eigentliche DB-Spalte in Kamelbuchstaben befindet.
Beispiel: Wenn Ihr tatsächlicher DB-Spaltenname lautet,
TestName
verwenden Sie:Wenn Ihnen das nicht gefällt, ändern Sie einfach den tatsächlichen DB-Spaltennamen in: test_name
quelle
In meinem Fall befand sich die Annotation auf der Methode getter () anstelle des Felds selbst (portiert von einer Legacy-Anwendung).
Spring ignoriert die Anmerkung auch in diesem Fall, beschwert sich aber nicht. Die Lösung bestand darin, es anstelle des Getters auf das Feld zu bringen.
quelle