Wenn ich versuche, eine Entität namens "user" mit JPA/hibernate zu persistieren, funktioniert das nicht. Die Tabelle wird nicht erstellt, und das liegt daran, dass user ein reserviertes Wort in Postgresql ist. Gibt es eine andere Möglichkeit, als die Tabelle anders zu benennen, damit dies funktioniert?
Antworten
Zu viele Anzeigen?JPA unterstützt die folgende Syntax, um festzulegen, dass der Tabellenname genau wie angegeben verwendet werden muss:
@Table(name="\"user\"")
Versuchen Sie, diese Annotation in Ihrer Entitätsklasse zu verwenden, und sehen Sie, ob es funktioniert. Die Backslashes werden verwendet, um einen Satz doppelter Anführungszeichen zu umgehen, daher sieht es etwas hässlich aus.
Ich würde sagen, dass Sie vermeiden sollten, Tabellennamen zu haben, die reservierte Wörter sind, mit hibernate. Man kann sie zwar umgehen, aber das kann in der Zukunft zu Problemen führen (z. B. in einer Abfrage). Der sicherste Weg ist also, die Tabelle anders zu benennen - sagen wir users
:
@Entity
@Table(name="users")
public class User {..}
PostgreSQL folgt dem ANSI-Standard für die Anführungszeichen von Objektnamen, daher müssen Sie "user" als Tabellennamen angeben (einschließlich der doppelten Anführungszeichen)
SELECT \*
FROM "user";
Ich weiß nicht, wie man hibernate anweisen kann, eine solche Anweisung zu erstellen.
Ich empfehle Ihnen dringend, einen anderen Namen für Ihren Tisch zu finden, er wird Ihnen mehr Probleme bereiten, als er wert ist.
Wie andere sagten, user
ist ein reserviertes Wort in SQL und Postgres.
Viele Datenbanken haben viele reservierte Wörter, über tausend, als ich das letzte Mal nachgezählt habe. Es ist also sehr leicht, aufgrund einer Kollision mit einem reservierten Wort in ein seltsames Problem zu geraten.
Unterstrich am Ende: user_
Hier ist der beste Tipp, den ich je für SQL gelernt habe: Immer einen nachgestellten Unterstrich anfügen zu Ihren Namen. Ich tue dies für Tabellennamen, Spaltennamen, Indexnamen und so weiter.
Die SQL-Spezifikation verspricht insbesondere † niemals ein Schlüsselwort oder ein reserviertes Wort mit einem Unterstrich am Ende zu haben. Dieses Versprechen ist merkwürdigerweise ohne Kontext in die Spezifikation eingefügt. Aber für mich schreit es förmlich: "Hängt an alle eure Namen einen Unterstrich an!".
Nachdem ich diese Regel eingeführt hatte, entdeckte ich einen angenehmen Nebeneffekt. Wenn ich den Unterstrich im Code, in den Kommentaren, in der Problemverfolgung und in den E-Mails sehe, weiß ich immer, dass wir uns speziell auf das Datenbankelement beziehen, wie z. B. customer_
Tabelle gegenüber dem Konzept des "Kunden" oder der Klasse Customer
in meinem Java-Code.
† Ich kann die SQL-Spezifikation nicht zitieren, da sie leider urheberrechtlich geschützt ist. In der SQL:2011 Spezifikation, siehe Abschnitt 5.4 Namen und Identifikatoren unter der Rubrik Syntax-Regeln Punkt 3, ANMERKUNG 111. Unter SQL-92 siehe Abschnitt 5.2, Punkt 11. Allein die Suche nach dem Wort underscore
wird funktionieren.
- See previous answers
- Weitere Antworten anzeigen