wake-up-neo.com

Erstellen eines Feldes mit reserviertem Word-Namen mit JPA

@Column(name="open")

Verwenden von sqlserver-Dialekt mit Ruhezustand.

[SchemaUpdate] Unsuccessful: create table auth_session (id numeric(19,0) identity not null, active tinyint null, creation_date datetime not null, last_modified datetime not null, maxidle int null, maxlive int null, open tinyint null, sessionid varchar(255) not null, user_id numeric(19,0) not null, primary key (id), unique (sessionid))
[SchemaUpdate] Incorrect syntax near the keyword 'open'.

Ich hätte erwartet, dass der Ruhezustand beim Anlegen der Tabelle den angegebenen Bezeichner verwendet.

Irgendwelche Ideen, wie man damit umgehen soll, außer das Feld umzubenennen?

64
TJR

Hatte das gleiche Problem, aber mit einem Tabellennamen namens Transaction. Wenn du eingestellt hast

hibernate.globally_quoted_identifiers=true

Dann werden alle Datenbankkennungen in Anführungszeichen gesetzt.

Hier habe ich meine Antwort gefunden Sonderzeichen im Tabellennamen Ruhezustand mit Fehler

Und alle verfügbaren Einstellungen hier gefunden https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html

Es konnten jedoch keine besseren Dokumente gefunden werden.

In meinem Fall war die Einstellung in meiner Spring-Eigenschaftendatei. Wie in den Kommentaren erwähnt, kann es sich auch um andere Konfigurationsdateien handeln, die sich auf den Ruhezustand beziehen.

34
Rafiek

Mit Hibernate als JPA 1.0-Anbieter können Sie ein reserviertes Schlüsselwort entgehen, indem Sie es in Backticks einschließen:

@Column(name="`open`")

Dies ist die von Hiberate Core geerbte Syntax:

5.4. SQL-Anführungszeichen

Sie können den Ruhezustand zwingen, ein .__ zu zitieren. Bezeichner in der generierten SQL durch Einschließen des Tabellen- oder Spaltennamens in Backticks im Mapping-Dokument . Der Ruhezustand verwendet das korrekte Zitatstil für den SQL-Dialekt . Dies sind normalerweise doppelte Anführungszeichen, aber die SQL Server verwendet Klammern und MySQL verwendet Backticks.

<class name="LineItem" table="`Line Item`">
    <id name="id" column="`Item Id`"/><generator class="assigned"/></id>
    <property name="itemNumber" column="`Item #`"/>
    ...
</class>

In JPA 2.0 ist die Syntax standardisiert und wird zu:

@Column(name="\"open\"")

Verweise

Verwandte Fragen

115
Pascal Thivent

Wenn Sie wie unten gezeigt verwenden, sollte es funktionieren

@Column(name="[order]")
private int order;
14
Raman
@Column(name="\"open\"")

Das wird sicher funktionieren. Dasselbe Problem ist bei mir passiert, als ich den Winterschlaf gelernt habe.

10
wmnitin

Nein - Ändern Sie den Spaltennamen. 

Dies ist datenbankspezifisch und Sie können eine solche Spalte einfach nicht erstellen. Schließlich sendet der Ruhezustand schließlich DDL an die Datenbank. Wenn Sie keine gültige DDL mit diesem Spaltennamen erstellen können, bedeutet dies, dass der Ruhezustand nicht so gut funktioniert. Ich denke nicht, dass Zitate das Problem lösen würden, selbst wenn Sie die DDL schreiben.

Auch wenn es Ihnen gelingt, dem Namen zu entgehen - ändern Sie ihn. Es funktioniert mit dieser Datenbank, aber nicht mit einer anderen.

3
Bozho

Bei einigen JPA-Implementierungen (z. B. der von mir verwendeten DataNucleus) wird der Bezeichner automatisch für Sie zitiert, sodass Sie dies nie erhalten.

0
Neil Stockton

Den reservierten Schlüsselwörtern manuell entgehen

Wenn Sie JPA verwenden, können Sie mit doppelten Anführungszeichen entkommen:

@Column(name = "\"open\"")

Wenn Sie die native Hibernate-API verwenden, können Sie sie mithilfe von Backticks umgehen:

@Column(name = "`open`")

Reservierte Schlüsselwörter werden automatisch entfernt

Wenn Sie reservierte Schlüsselwörter automatisch scape möchten, können Sie true die Hibernate-spezifische hibernate.globally_quoted_identifiers-Konfigurationseigenschaft festlegen:

<property
    name="hibernate.globally_quoted_identifiers"
    value=true"
/>

Weitere Informationen finden Sie in diesem Artikel .

0
Vlad Mihalcea