web-dev-qa-db-fra.com

Création d'un champ avec un nom de mot réservé avec JPA

@Column(name="open")

Utilisation du dialecte sqlserver avec hibernation.

[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'.

Je me serais attendu à ce que hibernate utilise l'identifiant cité lors de la création de la table.

Des idées sur la façon de gérer cela… autre que renommer le champ?

64
TJR

Avait le même problème, mais avec un nom de table appelé Transaction. Si vous définissez

hibernate.globally_quoted_identifiers=true

Tous les identifiants de base de données seront ensuite cités.

Trouvé ma réponse ici Caractère spécial dans le nom de la table hibernate en donnant une erreur

Et trouvé tous les paramètres disponibles ici https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html

Impossible de trouver de meilleurs documents pour cela cependant.

Dans mon cas, le paramètre était dans mon fichier de propriétés Spring. Comme indiqué dans les commentaires, il pourrait également s'agir d'autres fichiers de configuration liés à l'hibernation.

34
Rafiek

Avec Hibernate en tant que fournisseur JPA 1.0, vous pouvez échapper à un mot clé réservé en le mettant entre guillemets:

@Column(name="`open`")

Voici la syntaxe héritée de Hiberate Core:

5.4. Identificateurs cités SQL

Vous pouvez forcer Hibernate à citer un identifiant dans le SQL généré par renfermant le nom de la table ou de la colonne dans morsures dans le document de mappage . Hibernate utilisera le correct style de citation pour le dialecte SQL . Ce sont généralement des guillemets doubles, mais le SQL Server utilise des crochets et MySQL utilise des backticks.

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

Dans JPA 2.0, la syntaxe est normalisée et devient:

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

Références

Questions connexes

115
Pascal Thivent

Si vous utilisez comme indiqué ci-dessous cela devrait fonctionner

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

Cela fonctionnera à coup sûr. Le même problème s’est posé avec moi lorsque j’apprenais à hiberner.

10
wmnitin

Non - changez le nom de la colonne. 

Ceci est spécifique à la base de données et vous ne pouvez pas créer une telle colonne. Après tout, hibernate envoie enfin DDL à la base de données. Si vous ne pouvez pas créer de DDL valide avec ce nom de colonne, cela signifie que hibernate ne peut pas aussi bien. Je ne pense pas que citer résoudrait le problème même si vous écrivez le DDL.

Même si vous réussissez à échapper au nom, changez-le. Cela fonctionnera avec cette base de données, mais ne fonctionnera pas avec une autre.

3
Bozho

Certaines implémentations JPA (par exemple celle que j'utilise, DataNucleus) citent automatiquement l'identifiant pour vous, de sorte que vous ne l'obtenez jamais.

0
Neil Stockton

Échapper manuellement aux mots-clés réservés

Si vous utilisez JPA, vous pouvez vous échapper avec des guillemets doubles:

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

Si vous utilisez l'API native Hibernate, vous pouvez les échapper en utilisant des backticks:

@Column(name = "`open`")

Échappement automatique des mots clés réservés

Si vous souhaitez scaper automatiquement les mots clés réservés, vous pouvez définir sur true la propriété de configuration hibernate.globally_quoted_identifiers spécifique à Hibernate:

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

Pour plus de détails, consultez cet article .

0
Vlad Mihalcea