@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?
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.
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\"")
Si vous utilisez comme indiqué ci-dessous cela devrait fonctionner
@Column(name="[order]")
private int order;
@Column(name="\"open\"")
Cela fonctionnera à coup sûr. Le même problème s’est posé avec moi lorsque j’apprenais à hiberner.
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.
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.
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`")
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 .