27 Stimmen

Tabelle mit dem Namen "user" kann in Postgresql Hibernate nicht verwendet werden

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?

30voto

jpkrohling Punkte 13621

Um einen Bezeichner zu zitieren, verwenden Sie Backticks:

@Table(name="`users`")

Siehe dieses Beispiel aus der Hibernate-Testsuite:

https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/test/java/org/hibernate/test/quote/User.java#L31

Hibernate erkennt sie automatisch und konvertiert sie in das entsprechende Zitat für die von Ihnen verwendete Datenbank.

20voto

Jim Tough Punkte 13996

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.

7voto

Bozho Punkte 570413

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 {..}

5voto

a_horse_with_no_name Punkte 489934

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.

5voto

Basil Bourque Punkte 256611

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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X