112 votes

Comment mapper un champ d'entité dont le nom est un mot réservé en JPA

@Column(name="open")

Utilisation du dialecte sqlserver avec hibernate.

[SchemaUpdate] Non réussi : créer la 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] Erreur de syntaxe près du mot-clé 'open'.

J'aurais pensé qu'hibernate utiliserait un identifiant entre guillemets lors de la création de la table.

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

0 votes

159voto

Pascal Thivent Points 295221

Avec Hibernate en tant que fournisseur JPA 1.0, vous pouvez échapper à un mot clé réservé en l'encadrant avec des backticks :

@Column(name="`open`")

C'est la syntaxe héritée de Hibernate Core :

5.4. Identifiants SQL cités

Vous pouvez forcer Hibernate à citer un identifiant dans le SQL généré en encadrant le nom de la table ou de la colonne avec des backticks dans le document de mapping. Hibernate utilisera le style de cotation correct pour le dialecte SQL. Il s'agit généralement des doubles guillemets, mais le serveur SQL utilise des crochets et MySQL utilise des backticks.

    ...

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

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

Références

Questions connexes

70voto

Rafiek Points 135

J'ai eu le même problème, mais avec une table nommée Transaction. Si vous définissez

hibernate.globally_quoted_identifiers=true

Alors tous les identifiants de la base de données seront entre guillemets.

J'ai trouvé ma réponse ici Special character in table name hibernate giving error

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

Je n'ai pas trouvé de meilleures documentation pour cela cependant.

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

30voto

Vlad Mihalcea Points 3628

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

Si vous utilisez JPA, vous pouvez les é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`")

Échapper automatiquement aux mots clés réservés

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

Format Yaml

spring:
  jpa:
    properties:
      hibernate:
        globally_quoted_identifiers: true

17voto

Raman Points 66

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

@Column(name="[order]")
private int order;

0 votes

Tu fais juste cela sur le champ privé pas sur le getter ?

6 votes

Ceci est spécifique à SQL Server.

13voto

wmnitin Points 2833
@Column(name="\"ouvrir\"")

Cela fonctionnera certainement. J'ai eu le même problème lorsque j'apprenais Hibernate.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X