Ist es illegitim, eine JPA-Entität "Group" zu benennen?

7

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?

    
ifischer 30.06.2010, 10:15
quelle

3 Antworten

4

Gruppe ist ein reserviertes Wort in Ihrer Datenbank MySQL finden Sie hier

Bearbeiten:

%Vor%     
Paul Whelan 30.06.2010, 10:23
quelle
13

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 der persistence-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="&quot;customer&quot;"/>
    •   
  •   

Also wäre die JPA 2.0 Methode, Table wie folgt zu spezifizieren:

%Vor%

Dies wird definitiv von Hibernate unterstützt (siehe HHH-4553 ), keine undichte Abstraktion hier.

    
Pascal Thivent 30.06.2010 13:00
quelle
2

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.

    
DataNucleus 30.06.2010 10:41
quelle

Tags und Links