Ich entwickle eine JEE6-Anwendung mit JPA 2.0 und Hibernate 3.5.2-Final als Provider (und MySQL 5.1.41). Mein Anwendungsserver ist Glassfish V3.0.1. Ich habe bereits eine funktionierende CRUD-App mit einigen Entitäten und Beziehungen.
Nun habe ich eine (wirklich einfache) Entität mit dem Namen "Group" hinzugefügt. Die Entitätsklasse sieht so aus:
%Vor% Natürlich habe ich es auch zur persistence.xml hinzugefügt, wie zum Beispiel <class>model.Group</class>
. Meine persistence.xml löscht alle Tabellen auf Deploy und erstellt sie neu.
Wenn ich also meine Anwendung ausliege, werden die Tabellen für alle meine Entitäten mit Ausnahme der Tabellengruppe generiert. In den Hibernate-Logs habe ich den folgenden Fehler entdeckt (der die Bereitstellung der Anwendung nicht verhindert)
%Vor%Wenn ich nun die Entität in "MyGroup" umbenenne (die Eigenschaften bleiben gleich), ändere die persistence.xml entsprechend und stelle meine App erneut bereit, die Tabelle "MyGroup" wurde erfolgreich erstellt! Ich habe die folgenden Zeilen in den Logs gefunden, die zeigen, dass MyGroup korrekt erstellt wurde:
%Vor%Jeder hat eine Idee, was das Problem ist? Okay, ich könnte Group einfach in MyGroup umbenennen, aber ich möchte wirklich wissen, was hier vor sich geht. Gibt es irgendwelche Einschränkungen, die ich jetzt haben sollte, wie "nenne keine Unternehmensgruppe"? Aber wenn es so ist, warum ist der Fehler so unklar?
Gruppe ist ein reserviertes Wort in Ihrer Datenbank MySQL finden Sie hier
Bearbeiten:
%Vor%Sie können reservierte Schlüsselwörter für Namen von Datenbankobjekten verwenden, wenn Sie dem JPA-Provider mitteilen, dass sie diese nicht verwenden dürfen. Dies wurde in JPA 2.0 wie im folgenden Abschnitt der Spezifikation beschrieben standardisiert:
2.13 Benennung von Datenbankobjekten
(...)
Um Begrenzungsbezeichner anzugeben, eins der folgenden Ansätze müssen sein verwendet:
Es ist möglich anzugeben, dass alle Datenbankbezeichner für a Persistenzeinheit behandelt werden als Begrenzte Bezeichner durch Angabe das Element
<delimited-identifiers/>
innerhalb derpersistence-unit-defaults
Element des Objekts / relationales XML Zuordnungsdatei. Wenn die<delimited-identifiers/>
element ist angegeben, kann nicht überschrieben werden.Es ist möglich, auf Namensebene anzugeben, dass ein Name für a Datenbankobjekt soll interpretiert werden als begrenzter Bezeichner wie folgt:
- Bei der Verwendung von Annotationen wird ein Name durch Delimited Identifier angegeben Einschließen des Namens in Doppel Zitate, wobei die inneren Zitate sind entkommen, z.B.
@Table(name="\"customer\"")
.- Wann Mit XML wird ein Name als a angegeben Begrenzte Kennung durch Verwendung von double Zitate, z.B.
<table name=""customer""/>
Also wäre die JPA 2.0 Methode, Table
wie folgt zu spezifizieren:
Dies wird definitiv von Hibernate unterstützt (siehe HHH-4553 ), keine undichte Abstraktion hier.
Bei einigen JPA-Implementierungen können Sie Klassen mit solchen Namen verwenden, und die JPA-Implementierung macht das Sinnvolle und "zitiert" den Namen in jedem SQL (da es ein reserviertes Wort ist, wie es von Paul Whelan hervorgehoben wird) ist akzeptiert. DataNucleus ermöglicht dies sicherlich kein Problem.